<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Eran Kampf</title>
    <description>The latest articles on DEV Community by Eran Kampf (@ekampf).</description>
    <link>https://dev.to/ekampf</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F935%2F205185.jpeg</url>
      <title>DEV Community: Eran Kampf</title>
      <link>https://dev.to/ekampf</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ekampf"/>
    <language>en</language>
    <item>
      <title>Hard Truths About Entrepreneurship</title>
      <dc:creator>Eran Kampf</dc:creator>
      <pubDate>Sat, 27 Jan 2024 16:43:18 +0000</pubDate>
      <link>https://dev.to/ekampf/hard-truths-about-entrepreneurship-309j</link>
      <guid>https://dev.to/ekampf/hard-truths-about-entrepreneurship-309j</guid>
      <description>&lt;p&gt;I originally &lt;a href="https://twitter.com/ekampf/status/1751108841796935878"&gt;posted this on X&lt;/a&gt; as a response to &lt;a href="https://news.ycombinator.com/item?id=34103896"&gt;this HackerNews post&lt;/a&gt; (full text at the end of this post) but thought its worth expanding on.&lt;/p&gt;

&lt;p&gt;Too many people fall in love with the idea of entrepreneurship and all the buzz around it and confuse causation with effect - building somethign new and turning it into a successful venture is &lt;strong&gt;effing hard&lt;/strong&gt; and most likely fail. If you just do it for a reward of being popular and racking up “likes” on your posts - you wont get far.&lt;/p&gt;

&lt;p&gt;Or as Michael Arrington put it a &lt;a href="https://techcrunch.com/2010/10/31/are-you-a-pirate/"&gt;long while back&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Entrepreneurs, though, are all screwed up. They don’t need to be rewarded for risk, because they actually get utility out of risk itself. In other words, they like adventure.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Anyway, here are some hard truths that need to be told:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;3 failed attempts is nothing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;ProductHunt&lt;/em&gt; is useless BS echo chamber for fake “growth hackers”. Your customers aren’t there…&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you really verified your product “actually solved a problem” you’d have paying customers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You don’t need an “audience” or likes on your posts. Start with 5 customers from your existing network and figure out from there.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Don’t customers in your immediate social surrounding? You’re in the wrong space.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Find co-founders who can complete you and help build. If you can’t find anyone to join you, why would customers do it?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Indie hackers are not your customers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;But if for some reason they are - you chose a segment that is and doesn’t have a lot of capital. Think again…&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You don’t need to “exist in the world of Entrepreneurship” you need to exist in your problem space.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s the copy of the &lt;a href="https://news.ycombinator.com/item?id=34103896"&gt;original post on HackerNews&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I’m writing this post because I’m done. I can’t do this anymore. After three failed attempts at building a successful startup and spending time institutionalized, I’m giving up on my entrepreneurship dreams. I tried everything - building an audience, making sure my product actually solved a problem, getting paying customers, and writing high-quality content and contributing to the community. But no matter what I did, I couldn’t seem to get anywhere. My efforts were fruitless and I’m tired of trying. I barely had 20 followers, my substack and product blogs didn’t get any signups, and while I did get a few upvotes (8) on Product Hunt once, I never had a paid customer. It was as if the world was against me and no matter how hard I tried, I couldn’t make any progress. I remember trying to interact and hype up my fellow indiehackers on Twitter, regularly engaging with their content, but no one ever paid any attention to me or followed me back. It was like I didn’t even exist in the world of entrepreneurship. And even when I did get some attention, it was short-lived and never led to anything substantial.&lt;/p&gt;

&lt;p&gt;But it’s not just the lack of success that’s getting me down. It’s also the constant stream of digital nomad influencers on Twitter who sell extremely distorted, rosy, and often times false dreams to indie entrepreneurs like myself. They make it seem like building a successful startup is easy and anyone can do it with the right mindset and a few key tips. But the reality is that it’s not that simple. It’s fucking hard and it takes more than just a positive attitude to make it.&lt;/p&gt;

&lt;p&gt;I know I’m not alone in feeling this way. There are so many other indie entrepreneurs out there who are struggling and feeling like they’ll never make it. If you’re one of them, I want you to know that you’re not alone. It’s okay to feel defeated and to want to give up. But please don’t give up. Keep pushing forward and don’t let the failures define you. There’s always a chance for success, no matter how small it may seem.&lt;/p&gt;

&lt;p&gt;But for me, I can’t take it anymore. I’ve hit rock bottom and I have nothing left to give. To all the indie hackers, hacker news, and Reddit readers out there, please don’t be fooled by the false promises of digital nomad influencers. Building a startup is hard work and it takes time. It’s not as easy as they make it seem and it’s not for everyone. Don’t let your dreams consume you like they did for me, and PLEASE PLEASE PLEASE PROTECT YOUR MENTAL HEALTH AT ALL COST! Don’t make the same mistakes I did and realize that entrepreneurship may not be the path for you. It’s okay to admit defeat and move on to something else.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Golden Testing Helm Charts</title>
      <dc:creator>Eran Kampf</dc:creator>
      <pubDate>Sun, 14 Jan 2024 21:00:00 +0000</pubDate>
      <link>https://dev.to/ekampf/golden-testing-helm-charts-bfa</link>
      <guid>https://dev.to/ekampf/golden-testing-helm-charts-bfa</guid>
      <description>&lt;p&gt;We love tests at Twingate. When working on the &lt;a href="https://www.twingate.com"&gt;Twingate&lt;/a&gt;’s &lt;a href="https://github.com/Twingate/helm-charts"&gt;helm charts&lt;/a&gt; repository I wanted to incorporate testing like we do with other code. For a long time our release process requires a long process of manual testing - every change to the chart’s templates required a manual process of testing the chart with various inputs to make sure it still works as expected. Enter &lt;em&gt;golden tests&lt;/em&gt; as a way to automate this process…&lt;/p&gt;

&lt;h2&gt;
  
  
  What are Golden Tests?  #
&lt;/h2&gt;

&lt;p&gt;Golden tests, also known as &lt;em&gt;snapshot testing&lt;/em&gt;, involves comparing the current output of your code with a “golden” reference or a previously stored correct version.&lt;br&gt;&lt;br&gt;
It’s a particularly useful method in situations where the output is complex and can change over time, like configuration files or templates.&lt;/p&gt;
&lt;h2&gt;
  
  
  Gold Testing a Helm Chart  #
&lt;/h2&gt;

&lt;p&gt;The concept is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We maintain a directory of different helm input files (different permutations of &lt;code&gt;values.yaml&lt;/code&gt; that we want to test).&lt;/li&gt;
&lt;li&gt;For each such file we also maintain the expected output from that file. The expected output for running our chart with &lt;code&gt;foo.yaml&lt;/code&gt; as input is stored in &lt;code&gt;foo.golden.yaml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When we run our tests&lt;/strong&gt; the simply render the chart’s result for every input file and compare the output with the content of the golden copy - if they’re different we &lt;strong&gt;fail&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;When we want to update the golden copy&lt;/strong&gt; we can run the test with an &lt;code&gt;-update&lt;/code&gt; flag in which case, instead of comparing, it will write the output to the golden file.
We can review the diff before commiting the test changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s the code to run our tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package golden

import (
 "flag"
 "fmt"
 "os"
 "path/filepath"
 "regexp"
 "strings"
 "testing"

 "github.com/gruntwork-io/terratest/modules/helm"
 "gopkg.in/yaml.v2"
)

var update = flag.Bool("update", false, "update golden test output files")

type ChartYaml struct {
 Name string `yaml:"name"`
 Version string `yaml:"version"`
}

func GetChartYaml(t *testing.T) ChartYaml {
 chartYamlFile, err := os.ReadFile("./my-chart/Chart.yaml")
 if err != nil {
 t.Fatalf("Error reading Chart.yaml: %v", err)
 }

 var chartYaml ChartYaml

 if err := yaml.Unmarshal(chartYamlFile, &amp;amp;chartYaml); err != nil {
 t.Fatalf("Error unmarshaling YAML data: %v", err)
 }

 return chartYaml
}

func TestHelmRender(t *testing.T) {
 files, err := os.ReadDir("./test/golden")
 if err != nil {
 t.Fatal(err)
 }

 chartYaml := GetChartYaml(t)

 for _, f := range files {
 if !f.IsDir() &amp;amp;&amp;amp; strings.HasSuffix(f.Name(), ".yaml") &amp;amp;&amp;amp; !strings.HasSuffix(f.Name(), ".golden.yaml") {
 // Render this values.yaml file
 output, error := helm.RenderTemplateE(t,
 &amp;amp;helm.Options{
 ValuesFiles: []string{"test/golden/" + f.Name()},
 },
 "./my-chart",
 "test",
 []string{},
 )

 goldenFile := "test/golden/" + strings.TrimSuffix(f.Name(), filepath.Ext(".yaml")) + ".golden.yaml"

 // If error, we write the error to the golden snapshot
 if error != nil {
 output = fmt.Sprintf("%v\n", error)
 } else {
 // Replace `cn.chart` helper value with a stable value for testing
 // because we don't want to have to update all snapshots whenever Chart version changes
 regex := regexp.MustCompile(fmt.Sprintf("%s-%s", chartYaml.Name, chartYaml.Version))
 bytes := regex.ReplaceAll([]byte(output), []byte(fmt.Sprintf("%s-major.minor.patch-test", chartYaml.Name)))
 output = fmt.Sprintf("%s\n", string(bytes))
 }

 // If we were called with `-update` param - write `output` to our golden snapshot file`
 if *update {
 err := os.WriteFile(goldenFile, []byte(output), 0644)
 if err != nil {
 t.Fatal(err)
 }
 }

 // Read golden snapshot file and make sure its content is identical to output
 expected, err := os.ReadFile(goldenFile)
 if err != nil {
 t.Fatal(err)
 }

 if string(expected) != output {
 t.Fatalf("Expected %s, but got %s\n. Update golden files by running `go test -v ./... -update`", string(expected), output)
 }
 }
 }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You’d run this simply by running &lt;code&gt;go test -v ./...&lt;/code&gt; or &lt;code&gt;go test -v ./... -update&lt;/code&gt; if you want to update the golden copies.&lt;br&gt;&lt;br&gt;
An example of how we use this in Twingate can be found on the &lt;a href="https://github.com/Twingate/helm-charts/tree/master/test/golden"&gt;helm-charts&lt;/a&gt; and &lt;a href="https://github.com/Twingate/kubernetes-operator/tree/main/deploy/test/golden"&gt;Kubernetes Operator&lt;/a&gt; repositories on GitHub.&lt;/p&gt;

</description>
      <category>helm</category>
      <category>kubernetes</category>
      <category>devops</category>
    </item>
    <item>
      <title>Zero Downtime Django (gunicorn) Deployments on GKE</title>
      <dc:creator>Eran Kampf</dc:creator>
      <pubDate>Sat, 06 Jan 2024 05:39:46 +0000</pubDate>
      <link>https://dev.to/ekampf/zero-downtime-django-gunicorn-deployments-on-gke-46</link>
      <guid>https://dev.to/ekampf/zero-downtime-django-gunicorn-deployments-on-gke-46</guid>
      <description>&lt;p&gt;We recently switched to &lt;a href="https://www.twingate.com"&gt;Twingate’s&lt;/a&gt; GKE load balancer to use Google’s new &lt;a href="https://cloud.google.com/kubernetes-engine/docs/concepts/container-native-load-balancing"&gt;Container-native load balancer&lt;/a&gt;. The premise was good - LB talks directly to pods and saves an extra network hops, (with classic LB, traffic goes from LB to a GKE node which then, based on &lt;code&gt;iptables&lt;/code&gt; configured by &lt;a href="https://kubernetes.io/docs/reference/command-line-tools-reference/kube-proxy/"&gt;kube-proxy&lt;/a&gt;, get routed to the pod) and should perform better, support more features, and in general we’d rather be on google’s maintained side and not on legacy tech.&lt;/p&gt;

&lt;p&gt;However, immediately after making the switch, we started noticing short bursts of 502 errors whenever we’d deploy a new release of our services to the cluster. We tracked it down to the following behavior described in the &lt;a href="https://cloud.google.com/kubernetes-engine/docs/how-to/container-native-load-balancing#traffic_does_not_reach_endpoints"&gt;Container-native load balancing through Ingress docs&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;502 errors and rejected connections can also be caused by a container that doesn’t handle SIGTERM.&lt;br&gt;&lt;br&gt;
If a container doesn’t explicitly handle SIGTERM, it immediately terminates and stops handling requests. The load balancer continues to send incoming traffic to the terminated container, leading to errors.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why do we get 502s on pod restarts?  #
&lt;/h2&gt;

&lt;p&gt;The legacy load balancer relied on Kubernetes’s &lt;a href="https://kubernetes.io/docs/reference/command-line-tools-reference/kube-proxy/"&gt;kube-proxy&lt;/a&gt; to do the routing.&lt;br&gt;&lt;br&gt;
&lt;a href="https://kubernetes.io/docs/reference/command-line-tools-reference/kube-proxy/"&gt;kube-proxy&lt;/a&gt; configures the &lt;code&gt;iptables&lt;/code&gt; on all the cluster’s node with rules on how to distribute traffic to nodes.&lt;br&gt;&lt;br&gt;
When the load balancer receives a request, it sends it to a random node on the cluster which then routes it to the pod (which might be on a different node).&lt;br&gt;&lt;br&gt;
&lt;a href="https://kubernetes.io/docs/reference/command-line-tools-reference/kube-proxy/"&gt;kube-proxy&lt;/a&gt; is aware of the different pod’s states and when a pod changed state to &lt;code&gt;Terminating&lt;/code&gt; it immediately updates the routing information.&lt;/p&gt;

&lt;p&gt;With Container-native load balancing, traffic is routed directly to pods.&lt;br&gt;&lt;br&gt;
This eliminates the extra networking hop but at a cost that it is not aware of the pods state and relies on healthchecks to know when a pod is terminating.&lt;/p&gt;

&lt;p&gt;We were getting these 502s bursts because once we deployed a new version, old pods were being terminated and when receiving SIGTERM they’d stop processing new requests. The load balancer, however, would still send them requests until healthcheck fails (it was set to 10s in our case) and it removes it from circulation.&lt;/p&gt;

&lt;p&gt;To solve this we need to be able to gracefully terminate our pods - we need some sort of a toggle to tell the pod to start failing its healthcheck while it continues processing other requests regularly for enough time for the load balancer to stop sending traffic its way.&lt;/p&gt;

&lt;p&gt;In order to address this issue, we must find a way to gracefully terminate our pods.&lt;br&gt;&lt;br&gt;
This requires some kind of switch that instructs the pod to begin failing its health check, while simultaneously maintaining regular processing of other requests for enough time to allow the load balancer to mark the pod as done and stop sending traffic its way.&lt;/p&gt;

&lt;p&gt;To understand how to do this, lets first take a step back and understand Kubernetes’s process for terminating pods…&lt;/p&gt;
&lt;h3&gt;
  
  
  Whats the termination process for Kubernetes Pod
&lt;/h3&gt;
&lt;h4&gt;
  
  
  1. Pod is set to “Terminating” state
&lt;/h4&gt;

&lt;p&gt;The pod is then removed from endpoints list of all services and &lt;a href="https://kubernetes.io/docs/reference/command-line-tools-reference/kube-proxy/"&gt;kube-proxy&lt;/a&gt; updates routing rules on all nodes so that they shouldn’t receive traffic.&lt;/p&gt;
&lt;h4&gt;
  
  
  2. &lt;em&gt;preStop&lt;/em&gt; Hook is called
&lt;/h4&gt;

&lt;p&gt;The &lt;a href="https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#hook-details"&gt;preStop Hook&lt;/a&gt; is a command executed on the containers in the pod.&lt;/p&gt;
&lt;h4&gt;
  
  
  3. SIGTERM signal is sent to pod
&lt;/h4&gt;

&lt;p&gt;Kubernetes sends a SIGTERM to the containers in the pod to let them know they need to shut down soon.&lt;/p&gt;
&lt;h4&gt;
  
  
  4. Kubernetes waits for containers to gracefully terminate
&lt;/h4&gt;

&lt;p&gt;Kubernetes wait for a specified time, called &lt;em&gt;termination grace period&lt;/em&gt; for containers to gracefully terminate. By default, this period is set to &lt;em&gt;30 seconds&lt;/em&gt; but it can be customized by setting &lt;code&gt;terminationGracePeriodSeconds&lt;/code&gt; value as part of the pod spec:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: v1
kind: Pod
metadata:
 name: example-pod
spec:
 terminationGracePeriodSeconds: 60
 containers:
 - name: app
 image: busybox

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  5. SIGKILL signal is sent to pod and it’s removed
&lt;/h4&gt;

&lt;p&gt;If containers are still running after the grace period, they are sent SIGKILL signal and are forcibly removed. Kubernetes then cleans up its objects store.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gracefully Terminating Django (gunicorn)  #
&lt;/h2&gt;

&lt;p&gt;Gunicorn has its own definition for &lt;a href="https://docs.gunicorn.org/en/stable/settings.html#graceful-timeout"&gt;graceful timeout&lt;/a&gt; - when it receives a SIGTERM it will give workers a grace period (&lt;em&gt;30s&lt;/em&gt; by default) to finish processing the &lt;em&gt;current request&lt;/em&gt; they’re processing and exit. In our case we need gunicorn to continue serving requests for some time before shutting the worker down:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When pod is terminating, toggle health check (we’re using &lt;code&gt;/health&lt;/code&gt;) view&lt;/li&gt;
&lt;li&gt;Wait for 25 seconds (We set the LB to healthcheck every 5s and consider a pod down after 2 consecutive failures so 25s should give it enough time to fail)&lt;/li&gt;
&lt;li&gt;Send SIGTERM to gunicorn&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The simplest way to signal Django to start failing the healthcheck is by using a file - &lt;code&gt;/tmp/shutdown&lt;/code&gt; - if the file exists we should start failing the healthcheck.&lt;br&gt;&lt;br&gt;
(We can’t use a variable and\or http call because gunicorn runs multiple workers and doing some multiprocess memory sharing magic is too complex)&lt;/p&gt;

&lt;p&gt;So the detailed graceful shutdown process is as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kubernetes sets pod to “Terminating state”&lt;/li&gt;
&lt;li&gt;Kubernetes calls preStop hook 2.1. Create a &lt;code&gt;/tmp/shutdown&lt;/code&gt; file 2.2. Sleep for &lt;code&gt;25s&lt;/code&gt; - enough time for load balancer to refresh&lt;/li&gt;
&lt;li&gt;Kubernetes sends SIGTERM to container and gunicorn shuts down workers&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Our &lt;code&gt;preStop&lt;/code&gt; hook is pretty simple: (Note that our LB are configured to healthcheck every &lt;em&gt;5s&lt;/em&gt; and remove target if it fails twice so we need to sleep for &lt;em&gt;at least 10s&lt;/em&gt; to make sure pod is removed. These settings may differ on your system…)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lifecycle:
 preStop:
 exec:
 command:
 - sh
 - -c
 - echo "shutting down - $(date +%s)" &amp;gt;&amp;gt; /tmp/shutdown &amp;amp;&amp;amp; sleep 25

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Our Django healthcheck view:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SHUTDOWN_FILE = "/tmp/shutdown" # nosec

def is_shutting_down() -&amp;gt; bool:
 return os.path.exists(SHUTDOWN_FILE)

@internal_only_view
def health_check(_request):
 if is_shutting_down():
 return HttpResponse("Shutting Down...", status=503)

 ... Some extra healthcheck logic ...

 return HttpResponse("OK")

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  References  #
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://cloud.google.com/load-balancing/docs/https"&gt;External Application Load Balancer overview&lt;/a&gt; - Google classic load balancer vs. the new container-native ones&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#hook-details"&gt;Kubernetes preStop Hook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/kubernetes-engine/docs/concepts/container-native-load-balancing"&gt;Container-native load balancing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>django</category>
      <category>gunicorn</category>
    </item>
    <item>
      <title>5 Tips for Choosing Your Startup’s Technology Stack</title>
      <dc:creator>Eran Kampf</dc:creator>
      <pubDate>Sat, 31 Dec 2016 01:07:32 +0000</pubDate>
      <link>https://dev.to/ekampf/5-tips-for-choosing-your-startups-technology-stack-1ekn</link>
      <guid>https://dev.to/ekampf/5-tips-for-choosing-your-startups-technology-stack-1ekn</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mUOFZmoK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2Aq0FLnWXGGDsn2dNLRgj8Og.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mUOFZmoK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2Aq0FLnWXGGDsn2dNLRgj8Og.jpeg" alt="" width="800" height="620"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Having worked as a CTO and technology consultant to many startups I can tell you that choosing the initial technology is an important decision where you have to take into account several factors:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Prefer What You Already Know
&lt;/h4&gt;

&lt;p&gt;Moving fast when working on a new startup is important. If the founding team is already experienced in a specific stack, its an advantage to choose it and work within their comfort zone rather then re-learn a new technology.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Consider The Problem Space
&lt;/h4&gt;

&lt;p&gt;Sometimes the space your product is in dictates the stack.&lt;br&gt;&lt;br&gt;
Some technology stacks are specifically strong in certain areas (due to technical limitations, or just strong community) making them the go-to environments in those areas.&lt;/p&gt;

&lt;p&gt;For example, if you’re writing an IoT embedded solution, a graphics engine or an AAA game you’d probably need C\C++.&lt;/p&gt;

&lt;p&gt;Python, with libraries like Pandas, SciPy and NumPy (and a strong community around them ) is specifically strong solving computational problems like ones you’d find dealing with machine learning and data science.&lt;/p&gt;

&lt;p&gt;Ruby has Rails and a community focused on Web Development.&lt;/p&gt;

&lt;p&gt;And so on…&lt;br&gt;&lt;br&gt;
So its best to explore the problem space and see which tools and technologies are common and why before making a decision on your own stack.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Consider Hiring Advantages\Disadvantages
&lt;/h4&gt;

&lt;p&gt;Using an obscure or an uncommon technology stack can make recruiting hard. You want to aim for a stack that’ll make it easy to recruit people.&lt;br&gt;&lt;br&gt;
Granted, good developers can learn any stack, but the question is, will the want to?&lt;br&gt;&lt;br&gt;
For example, if you’re writing a chat server in Erlang it’ll probably be a lot harder for you to find Erlang developers (or people willing to learn Erlang) over finding people proficient with Java\Ruby\Python…&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Check the Community
&lt;/h4&gt;

&lt;p&gt;When shit hits the fan you want to know you have somewhere to go — somewhere to ask question and\or get help.&lt;br&gt;&lt;br&gt;
When choosing a product to use I’d look at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Any big names behind it as sponsors\users?&lt;/li&gt;
&lt;li&gt;How active is the community?
Is there a Slack channel\mailing list\public JIRA? are questions being answered on StackOverflow?
are people writing about it in blog posts? (I’d look for pros\cons posts, comparisons to competing products and migration\success stories)&lt;/li&gt;
&lt;li&gt;If open source — when was the last commit? is the code actively developed and maintained? Are the authors responsive to PRs?&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  5. Time to reach your first few milestones
&lt;/h4&gt;

&lt;p&gt;As a startup, getting fast to market is your top priority.&lt;br&gt;&lt;br&gt;
It’s easy to fall into pre-optimization mode and forget you don’t have to support a Facebook scale just yet ;)&lt;br&gt;&lt;br&gt;
Figure them out a set of &lt;em&gt;realistic goals&lt;/em&gt; and &lt;em&gt;milestones&lt;/em&gt; and choose your technology accordingly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You might be able to work just fine with a relational database instead of a complex NoSQL cluster.&lt;/li&gt;
&lt;li&gt;You might be able to do just fine with a hosted service and avoid managing servers and deployments to a certain point in time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s important to pick a technology that will let you get things done fast and meet your goals while not limiting your ability to scale or migrate to a better system in the future… (Its best if you can plan the roadmap to such a migration so you know where you’re heading)&lt;/p&gt;

&lt;p&gt;For example, in one of the companies I’m working with, we started managing our data pipeline using &lt;em&gt;Google’s Dataproc&lt;/em&gt;, which is essentially a hosted version of Apache Spark.&lt;/p&gt;

&lt;p&gt;At our current scale we dont need a Spark cluster running 24/7 so using Dataproc we can schedule jobs that start a cluster, do their thing, and shut it off. In the future we’ll be able keep the cluster running on Dataproc 24/7 or even (since we’re using Spark which is open source) migrate away from Google’s service and manage our own cluster(s).&lt;/p&gt;

&lt;h4&gt;
  
  
  (Bonus Tip) — Watch out for The “Tech Stirrer”
&lt;/h4&gt;

&lt;p&gt;Back in &lt;a href="https://medium.com/u/c7e7152f7d7a"&gt;dapulse&lt;/a&gt;, we had a nickname — “Tech Stirrer” (sounds better in Hebrew) — for developers who’s always chasing the latest new fashion and keep trying to add new technologies to the stack and rewriting existing code without a real need…&lt;/p&gt;

&lt;p&gt;The technology world is plagued with passing fashions. When consulting with friends and industry people you’ll always hear how you’re better off switching to the new latest and greatest.&lt;br&gt;&lt;br&gt;
There is no perfect technology. Everything has its Pros and Cons. Watch out taking advice from people who can’t see the cons…&lt;/p&gt;

&lt;p&gt;Switch to a new technology based on specific advantages to your business rather than technology hype.&lt;/p&gt;

&lt;p&gt;This post is an adapted and expanded version for my answer to &lt;a href="https://www.quora.com/How-do-startups-typically-choose-a-technology-stack-for-their-product/answer/Eran-Kampf"&gt;How do startups typically choose a technology stack for their product?&lt;/a&gt; on Quora&lt;/p&gt;




</description>
      <category>softwaredevelopment</category>
      <category>programming</category>
      <category>startup</category>
      <category>engineeringmanagemen</category>
    </item>
    <item>
      <title>How Do You Define “Good Code” ?</title>
      <dc:creator>Eran Kampf</dc:creator>
      <pubDate>Fri, 23 Dec 2016 01:07:17 +0000</pubDate>
      <link>https://dev.to/ekampf/how-do-you-define-good-code--3gl1</link>
      <guid>https://dev.to/ekampf/how-do-you-define-good-code--3gl1</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jgVT4Ivg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2A1okxJmZ6yUyxeVhhZduR2A.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jgVT4Ivg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2A1okxJmZ6yUyxeVhhZduR2A.jpeg" alt="" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I was on a phone interview the other day where I was asked for my definition of “Good Code”.&lt;/p&gt;

&lt;p&gt;The first thought that came to mind was &lt;em&gt;maintainability&lt;/em&gt; — if it can’t be understood, maintained and extended by other developers than its definitely not good.&lt;br&gt;&lt;br&gt;
 Then, other things came to mind: &lt;em&gt;efficiency&lt;/em&gt;, &lt;em&gt;elegance&lt;/em&gt; (simple, proper use of language constructs and environment capabilities), &lt;em&gt;modularity&lt;/em&gt;, proper &lt;em&gt;object-oriented design&lt;/em&gt;, …&lt;br&gt;&lt;br&gt;
 Of course, and we tend to take that for granted, it also has to work… without errors, security holes, etc.&lt;/p&gt;

&lt;p&gt;In his book, &lt;a href="http://amzn.to/2hYoeJE"&gt;Code Complete&lt;/a&gt;, Steve McConnel supports my definition of good code as maintainable code:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Another theme that runs throughout this book is an emphasis on code readability. Communication with other people is the motivation behind the quest for the Holy Grail of self-documenting code.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The computer doesn’t care whether your code is readable. It’s better at reading binary machine instructions than it is at reading high-level-language statements. You write readable code because it helps other people to read your code. Readability has a positive effect on all these aspects of a program:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Comprehensibility&lt;br&gt;&lt;br&gt;
Reviewability&lt;br&gt;&lt;br&gt;
Error rate&lt;br&gt;&lt;br&gt;
Debugging&lt;br&gt;&lt;br&gt;
Modifiability&lt;br&gt;&lt;br&gt;
Development time — a consequence of all of the above&lt;br&gt;&lt;br&gt;
External quality — a consequence of all of the above&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Readable code doesn’t take any longer to write than confusing code does, at least not in the long run. It’s easier to be sure your code works if you can easily read what you wrote. That should be a sufficient reason to write readable code. But code is also read during reviews. It’s read when you or someone else fixes an error. It’s read when the code is modified. It’s read when someone tries to use part of your code in a similar program.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;…&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Making code readable is not an optional part of the development process, and favoring write-time convenience over read-time convenience is a false economy. You should go to the effort of writing&lt;/em&gt; &lt;strong&gt;&lt;em&gt;good code&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;, which you can do once, rather than the effort of reading bad code, which you’d have to do again and again.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;On the other hand, Paul DiLascia, from MSDN’s &lt;em&gt;{END BRACKET}&lt;/em&gt; column, &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163962.aspx"&gt;provides a list of traits&lt;/a&gt; that good code should have:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Whether you code in C/C++, C#, Java, Basic, Perl, COBOL, or ASM, all good programming exhibits the same time-honored qualities: simplicity, readability, modularity, layering, design, efficiency, elegance, and clarity.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Simplicity&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;means you don’t do in ten lines what you can do in five. It means you make extra effort to be concise, but not to the point of obfuscation. It means you abhor open coding and functions that span pages. Simplicity — of organization, implementation, design — makes your code more reliable and bug free. There’s less to go wrong.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Readability&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;means what it says: that others can read your code. Readability means you bother to write comments, to follow conventions, and pause to name your variables wisely. Like choosing “taxrate” instead of “tr”.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Modularity&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;means your program is built like the universe. The world is made of molecules, which are made of atoms, electrons, nucleons, quarks, and (if you believe in them) strings. Likewise, good programs erect large systems from smaller ones, which are built from even smaller building blocks. You can write a text editor with three primitives: move, insert, and delete. And just as atoms combine in novel ways, software components should be reusable.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Layering&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;means that internally, your program resembles a layer cake. The app sits on the framework sits on the OS sits on the hardware. Even within your app, you need layers, like file-document-view-frame. Higher layers call ones below, which raise events back up. (Calls go down; events go up.) Lower layers should never know what higher ones are up to. The essence of an event/callback is to provide blind upward notification. If your doc calls the frame directly, something stinks. Modules and layers are defined by APIs, which delineate their boundaries. Thus, design is critical.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Design&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;means you take time to plan your program before you build it. Thoughts are cheaper than debugging. A good rule of thumb is to spend half your time on design. You need a functional spec (what the programs does) and an internal blueprint. APIs should be codified in writing.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Efficiency&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;means your program is fast and economical. It doesn’t hog files, data connections, or anything else. It does what it should, but no more. It loads and departs without fuss. At the function level, you can always optimize later, during testing. But at high levels, you must plan for performance. If the design requires a million trips to the server, expect a dog.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Elegance&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;is like beauty: hard to describe but easy to recognize. Elegance combines simplicity, efficiency, and brilliance, and produces a feeling of pride. Elegance is when you replace a procedure with a table, or realize that you can use recursion — which is almost always elegant:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_int factorial(int n) {   
  return n==0 ? 1 : n \* factorial(n-1);   
}_   
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Clarity&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;is the granddaddy of good programming, the platinum quality all the others serve. Computers make it possible to create systems that are vastly more complex than physical machines.&lt;br&gt;&lt;br&gt;
The fundamental challenge of programming is managing complexity. Simplicity, readability, modularity, layering, design, efficiency, and elegance are all time-honored ways to achieve clarity, which is the antidote to complexity.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Clarity of code. Clarity of design. Clarity of purpose. You must understand — really understand — what you’re doing at every level. Otherwise you’re lost. Bad programs are less often a failure of coding skill than of having a clear goal. That’s why design is key. It keeps you honest. If you can’t write it down, if you can’t explain it to others, you don’t really know what you’re doing.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So what are the most important trait for “Good Code” ?&lt;br&gt;&lt;br&gt;
 Later on, it struck me — like anything when it comes to engineering, its about &lt;strong&gt;balance&lt;/strong&gt;. When we write code we strive to find balance between complexity and simplicity by constantly evaluating the different tradeoffs we have to choose in order to get there.&lt;/p&gt;

&lt;p&gt;Therefore, &lt;em&gt;good code&lt;/em&gt; is code that &lt;em&gt;strikes the right balance balance&lt;/em&gt; between all of the qualities mentioned above.&lt;/p&gt;

&lt;p&gt;Think about it the next time you’re writing code or reading someone else’s…&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at&lt;/em&gt; &lt;a href="http://www.developerzen.com/2008/06/26/how-do-you-define-quotgood-codequot/"&gt;&lt;em&gt;www.developerzen.com&lt;/em&gt;&lt;/a&gt; &lt;em&gt;on June 26, 2008.&lt;/em&gt;&lt;/p&gt;




</description>
      <category>programming</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>99 Ways to Become a Better Developer</title>
      <dc:creator>Eran Kampf</dc:creator>
      <pubDate>Thu, 22 Dec 2016 00:59:55 +0000</pubDate>
      <link>https://dev.to/ekampf/99-ways-to-become-a-better-developer-330c</link>
      <guid>https://dev.to/ekampf/99-ways-to-become-a-better-developer-330c</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rs5vaP4H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AL6ry41DBNIJGc1hyFuwfKw.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rs5vaP4H--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn-images-1.medium.com/max/1024/1%2AL6ry41DBNIJGc1hyFuwfKw.jpeg" alt="" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ve encountered this post on my weekend reading — &lt;a href="http://effectize.com/become-coolest-programmer"&gt;91 Surefire Ways to Become an Event Greater Developer&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
It contain a comprehensive guide linking to all sort of blog posts providing insights on improving your skills as a developer.&lt;/p&gt;

&lt;p&gt;While the list is very long and sometimes debatable it does have some interesting pointers. If you do nothing else, delve into item #8: &lt;em&gt;Learn Programming by Not Programming&lt;/em&gt; referring &lt;a href="http://www.codinghorror.com/blog/archives/000543.html"&gt;to the following post by Jeff Atwood&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The topic in question is why some developers outperform their peers regardless of their accumulated experience:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;But the dirty little secret of the&lt;/em&gt; &lt;a href="http://en.wikipedia.org/wiki/Computer_software"&gt;&lt;em&gt;software&lt;/em&gt;&lt;/a&gt; &lt;em&gt;development industry is that this is also true&lt;/em&gt; even for people who can program_:_ &lt;a href="http://www.codinghorror.com/blog/archives/000072.html"&gt;&lt;em&gt;there’s a vast divide between good developers and mediocre developers&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A mediocre developer can program his or her heart out for four years, but that won’t magically transform them into a good developer. And the good developers always seem to have a natural knack for the stuff from the very beginning.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The answer lies in the quotes taken from &lt;a href="http://www.microsoft.com/presspass/exec/billg/speeches/2005/07-18FacultySummit.aspx"&gt;Bill Gates remarks&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“The nature of these jobs is not just closing your door and doing coding, and it’s easy to get that fact out. The greatest missing skill is somebody who’s both good at understanding the engineering and who has good relationships with the hard-core engineers, and bridges that to working with the customers and the marketing and things like that.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Eric Sink makes the distinction even clearer in &lt;a href="http://www.ericsink.com/No_Programmers.html"&gt;You Need Developers, Not Programmers&lt;/a&gt; drawing a distinction between &lt;em&gt;Programmers&lt;/em&gt; who are only excited about writing code and basically only care about doing that, and &lt;em&gt;Developers&lt;/em&gt; who contribute to the software product in many ways.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Great Programmer\Hacker Stereotype
&lt;/h3&gt;

&lt;p&gt;You all know that guy (hell, most of us were that guy when we just started out, I know I was) — he has great technical skills, likes writing code and can spend hours within his IDE writing code that’ll make most of us scratch our head. Yet, he views the world only in one dimension — code. Business? that’s for the managers to figure out. Sales\Marketing? annoyances for others to take care of. Documentation? but the code is so obvious…Builds? Deployment? Configuration? …&lt;/p&gt;

&lt;p&gt;Passion for code is a great quality. But as a specialist it’s all too easy digging yourself deeper and deeper into a skill you’ve already proven yourself to be capable at when you’d be &lt;strong&gt;better off using the time to cultivate other skills&lt;/strong&gt; that are part of the process of making software — rendering yourself obsolete over time…&lt;/p&gt;

&lt;p&gt;The great hacker is a one trick pony — he writes great code but that’s about it… Most of these guys end up working alone as consultants or freelancers where they don t have to care about that other stuff, or they end up as programmers at some big firms where there’s more room for specialists doing specific jobs (Architects to architecture, PMs do project management, Programmers code…). On the other hand, those who truly like making software, open up to the other aspects of software development.&lt;/p&gt;

&lt;p&gt;When that change in mindset happens, that’s when you can truly grow exponentially…&lt;/p&gt;

&lt;h3&gt;
  
  
  So what do I do?
&lt;/h3&gt;

&lt;p&gt;Ok, I guess you got the point… But how do you get started? Here are my own 5 cents on the topic…&lt;/p&gt;

&lt;h4&gt;
  
  
  Read, Read and Read Some More…
&lt;/h4&gt;

&lt;p&gt;We’re in an industry that is moving forward at a fast pace. Technology becomes obsolete every year and a half or so and as developers. we have to constantly struggle to keep up. Books are not only great to help you keep up but also to expand your knowledge to other fields. There are plenty of interesting books and blogs about, well, pretty much everything.&lt;/p&gt;

&lt;p&gt;Here are some recommendations to get you started:&lt;/p&gt;

&lt;p&gt;Oh and one word about &lt;em&gt;programming books&lt;/em&gt;: the best ones are &lt;em&gt;timeless&lt;/em&gt;, transcending choice of language, IDE, and platform.&lt;br&gt;&lt;br&gt;
 I try to stay away from them thick, heavy, language\platform specific references — most of them go out of date after a year or so anyway and most of the information there could be easily obtained elsewhere (online — Google, the product’s docs, blogs…)&lt;/p&gt;

&lt;p&gt;Most programming big are just a waste of your time (and money…)&lt;/p&gt;

&lt;h4&gt;
  
  
  Contribute to an Open Source Project
&lt;/h4&gt;

&lt;p&gt;Back in the days of Delphi, I was involved in &lt;a href="http://www.delphi-jedi.org/"&gt;Project JEDI&lt;/a&gt; dedicated to exposing different APIs (especially the Win32 API) to Delphi developers. I learned a lot working with the JEDI code base, documentation, samples and other team members.&lt;/p&gt;

&lt;p&gt;Later when it was time to get drafted to the Israeli Army (we all have to do it at 18 here) the experience, credit, and code samples help me land a (very) exclusive position as a programmer. Who knows where I’d be today if I didn’t qualify and had to serve as a combatant…&lt;/p&gt;

&lt;p&gt;Contributing to an open source project is a great way to gain experience, learn and get better.&lt;br&gt;&lt;br&gt;
 There are no job interviews to pass, degree requirements or commitment to working hours or schedule required — you can just join in and start submitting patches or &lt;a href="http://nongeeksight.blogspot.com/2006/09/5-ways-to-contribute-to-open-source.html"&gt;contribute in ways other than code&lt;/a&gt; (submit bugs, docs, support, …).&lt;/p&gt;

&lt;p&gt;You can learn a lot just from studying the code and interacting with your peers…&lt;/p&gt;

&lt;p&gt;Contributing to open source shows dedication and passion — it’s a walking talking resume.&lt;/p&gt;

&lt;h4&gt;
  
  
  Get a mentor
&lt;/h4&gt;

&lt;p&gt;Find yourself a mentor or mentors who can teach you about different aspects of the business. I’ve had several at SAP and talking with them proved to be an invaluable asset (If you’re reading, thanks! :))&lt;/p&gt;

&lt;p&gt;It doesn’t have to be official mentoring which is part of the person’s goals or job description. Many of your peers are experts in their field and they’ll be happy to show you around if you just show some interest…&lt;/p&gt;

&lt;h4&gt;
  
  
  Become a Mentor
&lt;/h4&gt;

&lt;p&gt;Great developer are eager to learn… and teach. Can you pass you passion and knowledge to others?&lt;/p&gt;

&lt;p&gt;You can also…&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open a blog about your experience, opinions, etc.&lt;/li&gt;
&lt;li&gt;Start answering questions at &lt;a href="http://stackoverflow.com/"&gt;stackoverflow.com&lt;/a&gt; and collect achievements&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Land an Internship
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Try getting an internship in a different role.&lt;/strong&gt; When I was in SAP they had a special program allowing employees to apply for a ~6 months position somewhere within the company. The reason behind it was to get employees familiar with different aspects of the company. Maybe product management, marketing or sales in not really your first choice of profession but why not try it for a couple of months without the risk of going through a career change? How cool is that? I’m sure many large corporations has something similar and even if not, it can’t hurt if you come up with such an interesting offer to your boss…&lt;/p&gt;

&lt;h4&gt;
  
  
  Own a Product Area
&lt;/h4&gt;

&lt;p&gt;Get ownership on some part of the product your team is working on.&lt;br&gt;&lt;br&gt;
Wether a specific component or a vertical (like Security) you should be in charge of getting it done — from getting the definition done with the product\sales\business team, through UX, development, QA, etc…&lt;br&gt;&lt;br&gt;
There’s nothing better than learning about the process of software development through experiencing the entire cycle…&lt;/p&gt;

&lt;h4&gt;
  
  
  Innovate
&lt;/h4&gt;

&lt;p&gt;Start something new. When working on Duet we’ve had many issues getting the thing deployed. So I made a tool for (myself mainly) our QA and RIG (regional implementation group — the guys who work with customers) to help diagnose problems. This later became the official &lt;a href="http://www.google.co.il/url?sa=t&amp;amp;source=web&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=https%3A%2F%2Fwww.sdn.sap.com%2Firj%2Fscn%2Fdownloads%3Frid%3D%2Flibrary%2Fuuid%2F301be4d1-2724-2b10-ac93-ac912f13a913&amp;amp;ei=K-00Sbi5I5aKxAGVifWbCA&amp;amp;usg=AFQjCNGjTf0ZpB6ePd5B_ZrGKj7RLzmHgg&amp;amp;sig2=r16J2zsIWSQYWSnMzTUikg"&gt;Duet Support Tool&lt;/a&gt; and got its own dedicated development time. Is your product, development environment perfect? I’m sure not… find a need a feel the gap…&lt;/p&gt;

&lt;p&gt;Why? If by owning a product area you learned about the entire development cycle, here you’ll learn about defining and “selling” to the team…&lt;/p&gt;

&lt;h3&gt;
  
  
  Bonus Reading…
&lt;/h3&gt;

&lt;p&gt;Another link worth visiting is the one about the &lt;a href="http://www.kevinwilliampang.com/post/Metrosexual-Developers.aspx"&gt;Metrosexual Developer&lt;/a&gt;. Funny and true… 😉&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Related:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.developerzen.com/2007/08/21/quest-for-glory-so-you-want-to-be-a-great-developer/"&gt;So you want to be a great developer?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at&lt;/em&gt; &lt;a href="http://www.developerzen.com/2008/12/05/99-ways-to-become-a-better-developer/"&gt;&lt;em&gt;www.developerzen.com&lt;/em&gt;&lt;/a&gt; &lt;em&gt;on December 5, 2008.&lt;/em&gt;&lt;/p&gt;




</description>
      <category>programming</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>5 Things I Learned About Managing an R&amp;D Team</title>
      <dc:creator>Eran Kampf</dc:creator>
      <pubDate>Wed, 19 Aug 2015 00:00:00 +0000</pubDate>
      <link>https://dev.to/ekampf/5-things-i-learned-about-managing-an-rd-team-2mhh</link>
      <guid>https://dev.to/ekampf/5-things-i-learned-about-managing-an-rd-team-2mhh</guid>
      <description>&lt;p&gt;I made the first developer I was ever in charge of want to quit programming. That was roughly over 15 years ago. I’d like to think I’ve improved over the years…&lt;/p&gt;

&lt;p&gt;I think a key moment to that development was during the early years of my professional career. I was working at a big software company, spending probably 12+ hours a day at work and not getting enough done. A lot of my time was spent on solving bugs and problems for other team members rather than making actual progress on product features.&lt;/p&gt;

&lt;p&gt;One day one of the team leads pulled me aside and told me that, rather than going around fixing problems I should tutor people so that they could be more efficient and hopefully solve these problems on their own.&lt;br&gt;&lt;br&gt;
“Your time is limited.”, he said, “You can get much more done if you start delegating”.&lt;/p&gt;

&lt;p&gt;That was my first “management lesson”. It got me thinking beyond the code and architecture of a particular project, about the team behind it and how to get it working effectively.&lt;/p&gt;

&lt;p&gt;Fast forward by a decade or so, I’m still in tech writing software. I’ve worked in teams, I’ve helped teams as a freelancer and I’ve built teams as a CTO.&lt;br&gt;&lt;br&gt;
Mainly, I had tons of chances to mess up… and learn…&lt;/p&gt;

&lt;h2&gt;
  
  
  5 Things I Learned About Managing an R&amp;amp;D Team  #
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Let Go
&lt;/h3&gt;

&lt;p&gt;Let go. You can’t do everything yourself. You have to learn how to delegate effectively and the first is letting go. When you become the bottleneck for decisions — your team becomes idle and unmotivated.&lt;/p&gt;

&lt;p&gt;Developers turning managers often have trouble with this. It’s hard to pull back from the urge of doing everything yourself the way you see right, to trusting that responsibility to another person.&lt;br&gt;&lt;br&gt;
It’s also hard to factor out individual preferences when reviewing said work, to distinguish between “I would have done this differently” (usually “better” is there too) to “this is not done right and needs more work/rewrite/refactor/…”.&lt;/p&gt;

&lt;p&gt;Recognize you can’t do &lt;em&gt;everything&lt;/em&gt;. Close your eyes, fall backward, and learn to trust.&lt;br&gt;&lt;br&gt;
It’s worth it — you get much more stuff done, less pressure, and your team is better.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Be Agile
&lt;/h3&gt;

&lt;p&gt;I worked at a company where they liked SCRUM. They &lt;em&gt;really&lt;/em&gt; liked SCRUM. Everything had to be SCRUM. By the book. Every meeting, every procedure… to a point where it was counter-productive — you had to skew your development process to deliver SCRUM result.&lt;/p&gt;

&lt;p&gt;You couldn’t, for example, split work between backend infrastructure and UI they’re separate systems requiring a different focus.&lt;br&gt;&lt;br&gt;
In SCRUM, “&lt;em&gt;each&lt;/em&gt; sprint is required to deliver a potentially shippable product increment” which means you need to demo some half-assed &lt;em&gt;“product”&lt;/em&gt; to a &lt;em&gt;product owner&lt;/em&gt; (who represents a &lt;em&gt;customer&lt;/em&gt; that doesn’t care about backend infrastructure and just wants his dashboards) on every iteration.&lt;br&gt;&lt;br&gt;
A team could not concentrate on having a solid backend before crafting a UI, it had to do both at the same time to meet the sprint requirements.&lt;/p&gt;

&lt;p&gt;These guys were 100% “Agile”, but still missing on deadlines, under-delivering and burning out due to their process’s inefficiency.&lt;/p&gt;

&lt;p&gt;By now you’re probably reading this story and saying to yourself “They just didn’t get SCRUM right”. Which is exactly the point — what’s “right”? who decides? is it the holy texts of some Book of Agile?&lt;/p&gt;

&lt;p&gt;As a development manager, the #1 thing that should be on your mind is *“What can we change in the what we’re doing to be better?” *There was no one there asking this simple question.&lt;/p&gt;

&lt;p&gt;There’s a subtle difference between &lt;strong&gt;doing agile&lt;/strong&gt; , which is the simple practice of some methodology, and &lt;strong&gt;being agile&lt;/strong&gt; which is outcome-oriented and feedback driven.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Be agile.&lt;/em&gt;&lt;br&gt;&lt;br&gt;
The process is not set in stone. It’s there to be personalized and constantly be tweaked &amp;amp; changed… You have to constantly adjust how things are done according to team feedbacks and lessons learned to keep it as an asset rather than a burden.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Run Efficient Meetings
&lt;/h3&gt;

&lt;p&gt;Most meetings are &lt;a href="https://www.ted.com/talks/david_grady_how_to_save_the_world_or_at_least_yourself_from_bad_meetings?language=en"&gt;crowded and inefficient&lt;/a&gt;. A lot of time is wasted on ops (scheduling and getting people in the meeting) and on syncing everyone up-to-speed which rarely leaves time to actually discussing actionable items and making a decision (which is also why meetings tend to stretch beyond their schedule).&lt;/p&gt;

&lt;p&gt;Don’t waste time syncing people. Have that information ready beforehand so that people come ready.&lt;/p&gt;

&lt;p&gt;Use tools like &lt;a href="https://www.monday.com/"&gt;Monday.com&lt;/a&gt; and &lt;a href="https://slack.com/"&gt;Slack&lt;/a&gt; to write ad-hoc updates. This way anyone can catch up on relevant topics without being called into a meeting. When people attend a meeting when they’re prepared you can skip the prolog and go straight to the issues at hand. For example: Weekly meetings can skip summarizing what everyone did the past week and focus on planning the next week.&lt;/p&gt;

&lt;p&gt;The use of ad-hoc updates opens your organization’s information to more people than you would normally call into a meeting or add to an email thread. It also allows people to catch up on their own schedule. I’ve found people tend to be more up-to-date and engaged this way plus you get the benefit of not wasting time in meetings. So why not?&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Streamline the R&amp;amp;D process!
&lt;/h3&gt;

&lt;p&gt;The R&amp;amp;D processes and infrastructure are the heart of the team. If deploying a new release is hard — each new release will be a nightmare. If writing tests is complex — developer won’t write them, or waste a lot of time and effort on them (and be miserable writing the few tests they do write) and in any case, you’ll end up with miserable developers chasing your own tail with bugs on each release. If you don’t have proper monitoring and logging infrastructure you’re flying blind into combat…&lt;/p&gt;

&lt;p&gt;Development Infrastructure requires constant care and incremental work. It’s also something most people outside R&amp;amp;D can’t really understand and appreciate… It’s your job to protect and grow it.&lt;/p&gt;

&lt;p&gt;(Also… automate. automate. automate.)&lt;/p&gt;

&lt;h3&gt;
  
  
  5. People — just know your team’s strengths, weaknesses, and goals
&lt;/h3&gt;

&lt;p&gt;A development team is &lt;a href="https://hbr.org/2014/06/your-company-is-not-a-family/"&gt;somewhat like a sports team&lt;/a&gt;. It’s members each have their own strengths and weaknesses that you have to know and use. They also have their own personal goals.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;… The reason these teams have been able to remain consistent winners despite high personnel turnover is that they have been able to combine a realistic view of the often temporary nature of the employment relationship with a focus on shared goals and long-term personal relationships.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Finding those shared goals is and working on them helps keeps you both engaged and motivated. When good people don’t feel like their moving forward with their own goals they lose motivation and eventually leave. It’s also great for hiring 😉&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
