<?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: Tower</title>
    <description>The latest articles on DEV Community by Tower (@gittower).</description>
    <link>https://dev.to/gittower</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%2Forganization%2Fprofile_image%2F2936%2F7b676e55-e357-47ed-ade4-5add22cf2484.png</url>
      <title>DEV Community: Tower</title>
      <link>https://dev.to/gittower</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gittower"/>
    <language>en</language>
    <item>
      <title>2024's Git Survey is Live!</title>
      <dc:creator>Bruno Brito</dc:creator>
      <pubDate>Thu, 24 Oct 2024 15:30:52 +0000</pubDate>
      <link>https://dev.to/gittower/2024s-git-survey-is-live-1md8</link>
      <guid>https://dev.to/gittower/2024s-git-survey-is-live-1md8</guid>
      <description>&lt;p&gt;Git has become an indispensable tool for developers, not only to keep track of changes but also for collaboration. But how well do you really know this powerful tool? And what aspects could use some improvement? 🤔&lt;/p&gt;

&lt;p&gt;We would love to know!&lt;/p&gt;

&lt;p&gt;This is your chance to share your insights, experiences, and pain points with Git, whether you're a seasoned pro or just starting out. By participating in this &lt;a href="https://www.git-tower.com/survey" rel="noopener noreferrer"&gt;survey&lt;/a&gt;, you'll not only contribute to a better understanding of how developers interact with Git, but you'll also help shape the future of &lt;a href="https://www.git-tower.com/" rel="noopener noreferrer"&gt;Tower's Git client&lt;/a&gt; ☺️&lt;/p&gt;

&lt;p&gt;As a token of appreciation for your time and valuable input, &lt;strong&gt;every participant will be automatically entered into a raffle to win one of ten $50 Amazon gift cards&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.git-tower.com/survey" rel="noopener noreferrer"&gt;survey&lt;/a&gt; is open now, and it only takes a few minutes to complete!&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>gitlab</category>
      <category>programming</category>
    </item>
    <item>
      <title>What's New in Tower 10</title>
      <dc:creator>Bruno Brito</dc:creator>
      <pubDate>Wed, 02 Aug 2023 20:59:54 +0000</pubDate>
      <link>https://dev.to/gittower/whats-new-in-tower-10-4k89</link>
      <guid>https://dev.to/gittower/whats-new-in-tower-10-4k89</guid>
      <description>&lt;p&gt;The much-anticipated version 10 of our Git client has been released, and it's our most colorful update yet.&lt;/p&gt;

&lt;p&gt;Why? Because we've introduced Syntax Coloring to every file and diff view!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PW2G_DZw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0wd4uhiske4abk44rprv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PW2G_DZw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0wd4uhiske4abk44rprv.jpg" alt="Image description" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With support for nearly 200 languages, your Git repository's code is now more readable than ever! We also took the opportunity to add two other customization options that have been highly requested:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The possibility to show or hide invisible characters.&lt;/li&gt;
&lt;li&gt;The ability to configure the preferred tab width (the default is 4).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It looks beautiful in dark mode, too! 😍&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tBMghAaV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yyi8nwbfwmpwjwfux4zp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tBMghAaV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yyi8nwbfwmpwjwfux4zp.jpg" alt="Image description" width="800" height="509"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tower's themes have also been fully updated to support the new Syntax Highlighting feature. That said, you can still modify them to your liking or create new ones from scratch.&lt;/p&gt;

&lt;p&gt;You can &lt;a href="https://www.git-tower.com/"&gt;download a 30-day trial for free&lt;/a&gt; to try it out! No registration or email is required.&lt;/p&gt;

&lt;p&gt;P.S. This is the first of many exciting features that are on &lt;a href="https://www.git-tower.com/blog/coming-up-on-the-roadmap-2023/"&gt;our roadmap&lt;/a&gt; for the upcoming months. Keep an eye out for what's to come! 🔥&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>news</category>
    </item>
    <item>
      <title>Mac Developer Survey 2022 (with giveaway)</title>
      <dc:creator>Julian Rothkamp</dc:creator>
      <pubDate>Thu, 10 Mar 2022 09:44:16 +0000</pubDate>
      <link>https://dev.to/gittower/mac-developer-survey-2022-with-giveaway-2820</link>
      <guid>https://dev.to/gittower/mac-developer-survey-2022-with-giveaway-2820</guid>
      <description>&lt;p&gt;&lt;strong&gt;Get the chance to win some of the best Mac apps and developer tools by participating in the annual Mac Developer Survey! 🙌&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Help us learn more about the Mac community, the most popular tools among developers, their preferred programming languages, and - most importantly - what kind of music they listen to while coding. &lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://www.git-tower.com/blog/mac-dev-survey-2022/"&gt;Take the Mac Developer Survey&lt;/a&gt; 👈&lt;/p&gt;

&lt;p&gt;We teamed up with some of the most popular apps and tools for developers and raffle over 100 prizes among all participants. &lt;strong&gt;Get a chance to win free licenses&lt;/strong&gt; for &lt;a href="https://www.flexibits.com"&gt;Fantastical&lt;/a&gt;, &lt;a href="https://culturedcode.com/"&gt;Things&lt;/a&gt;, &lt;a href="https://www.pixelmator.com/"&gt;Pixelmator&lt;/a&gt;, &lt;a href="https://www.git-tower.com/"&gt;Tower&lt;/a&gt;, &lt;a href="https://www.scraperapi.com/"&gt;ScraperAPI&lt;/a&gt;, &lt;a href="http://www.ulyssesapp.com/"&gt;Ulysses&lt;/a&gt;, &lt;a href="https://nova.app/"&gt;Nova&lt;/a&gt;, &lt;a href="https://www.kapeli.com/"&gt;Dash&lt;/a&gt;, &lt;a href="https://smilesoftware.com/textexpander"&gt;TextExpander&lt;/a&gt;, &lt;a href="https://paw.cloud/"&gt;Paw&lt;/a&gt;, &lt;a href="https://www.redsweater.com/"&gt;MarsEdit&lt;/a&gt;, &lt;a href="https://cleanshot.com/"&gt;CleanShot X&lt;/a&gt;, &lt;a href="https://www.agenda.com/"&gt;Agenda&lt;/a&gt;, &lt;a href="https://www.alfredapp.com/"&gt;Alfred&lt;/a&gt;, &lt;a href="https://www.deploybot.com/"&gt;DeployBot&lt;/a&gt;, &lt;a href="https://www.prerender.io/"&gt;Prerender&lt;/a&gt;, and many more. &lt;/p&gt;

&lt;p&gt;The results of the survey will be published. If you are curious, you can check out last year's results and learn &lt;a href="https://www.git-tower.com/blog/mac-dev-survey-2021-results/"&gt;what apps and tools developers on the Mac prefer&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Who's behind the survey?&lt;/em&gt;&lt;br&gt;
The survey is conducted by Tower - the team behind &lt;a href="https://www.git-tower.com"&gt;the best Git client&lt;/a&gt; for Mac and Windows. Learn more about how Tower enables you to easily &lt;a href="https://www.git-tower.com/features/undo/mac"&gt;undo mistakes in Git&lt;/a&gt;. &lt;/p&gt;

</description>
      <category>programming</category>
      <category>ios</category>
      <category>swift</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Mac Developer Survey</title>
      <dc:creator>Julian Rothkamp</dc:creator>
      <pubDate>Wed, 10 Mar 2021 12:42:27 +0000</pubDate>
      <link>https://dev.to/gittower/mac-developer-survey-3jbl</link>
      <guid>https://dev.to/gittower/mac-developer-survey-3jbl</guid>
      <description>&lt;p&gt;&lt;strong&gt;Are your curious about the state of the developer community on the Mac?&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;If you are working as a &lt;strong&gt;web&lt;/strong&gt; or &lt;strong&gt;software developer on macOS&lt;/strong&gt;, then you can help us find out by taking our &lt;a href="https://www.git-tower.com/blog/mac-dev-survey-2021/"&gt;short survey&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;We will make the results publicly available.&lt;/p&gt;

&lt;p&gt;To make the survey more fun, we teamed up with the best Mac apps and dev tools to give you the chance to &lt;strong&gt;win over 100 prizes&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Win free licenses&lt;/strong&gt; for Sketch, 1Password, Things, Agenda, Nova, Ulysses, Paw, Alfred, TextExpander, Transmit, Little Snitch, Reveal, Marked, PaintCode, Soulver, Dash, Travis CI, Kaleidoscope, Tower and more!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.git-tower.com/blog/mac-dev-survey-2021/"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ahfkPrb8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v3r5u5v9t6ho37f1uern.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>news</category>
      <category>swift</category>
      <category>ios</category>
    </item>
    <item>
      <title>App Design on macOS Big Sur</title>
      <dc:creator>Kristian Lumme</dc:creator>
      <pubDate>Tue, 02 Mar 2021 17:49:44 +0000</pubDate>
      <link>https://dev.to/gittower/app-design-on-macos-big-sur-d4c</link>
      <guid>https://dev.to/gittower/app-design-on-macos-big-sur-d4c</guid>
      <description>&lt;p&gt;In 2015, &lt;a href="https://www.git-tower.com/blog/tower2-yosemite-design/"&gt;we covered&lt;/a&gt; the latest design changes in macOS on the Tower blog. At that point, OS X Yosemite had just been released, featuring a major overhaul of the user interface. Following in the footsteps of iOS, Yosemite moved away from a skeuomorphic interface towards a more flat, minimalistic design. At the same time, the &lt;a href="https://www.git-tower.com/"&gt;Tower Git client&lt;/a&gt; was updated to adapt the new look and feel of OS X 10.10.&lt;/p&gt;

&lt;p&gt;Well, the time is here again! macOS Big Sur has been released, and with it come comprehensive visual changes to the primary elements of the operating system, including windows, menus, icons and the dock. We’ve been hard at work making sure Tower feels right at home in this new environment. In this article, we’ll take a look at some of the design changes introduced in macOS Big Sur, and how we’ve applied these to Tower for Mac.&lt;/p&gt;




&lt;p&gt;What motivates the changes to the user interface, and what is the long-term vision that drives and shapes these changes from version to version? Only Apple knows for sure. However, as spectators, we can certainly discern some overall trends. The Big Sur updates reflect some movements that have been going on for a long time.&lt;/p&gt;

&lt;p&gt;Like OS X Yosemite, Big Sur seems to move in the direction of iOS visually. While it’s true that there’s more to macOS Big Sur than copying iOS, and while it may be more appropriate to say that the design of both iOS and macOS reflect the direction of the technology industry and of Apple as a whole, this statement does have a point. In &lt;a href="https://www.youtube.com/watch?v=Q2aaCDNjWEg"&gt;an interview&lt;/a&gt; with MKBHD, Craig Federighi (Apple's senior vice president of Software Engineering) mentions the mental overhead required when constantly switching between the different interfaces of iOS and macOS. Making macOS feel more familiar for iOS-users reduces this overhead.&lt;/p&gt;

&lt;p&gt;Apple has also been moving away from cluttered interfaces, towards sparseness and placing as much focus on content as possible. Whether you’re viewing photos, reading, or browsing your files, the content is featured prominently while available actions aren’t always immediately visible. With its increased spacing, reduced contrast and lighter icons, macOS Big Sur takes another step in this direction.&lt;/p&gt;

&lt;h1&gt;
  
  
  Changes in Big Sur
&lt;/h1&gt;

&lt;p&gt;Having covered the general trends, let’s take a closer look at some of the visual updates in Big Sur! The look of windows is a good place to start. One of the essential elements of the user interface, windows receive some prominent changes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Corners are more rounded than before.&lt;/li&gt;
&lt;li&gt;Colors are lighter and contrast is decreased. &lt;/li&gt;
&lt;li&gt;Increased spacing and more discreet icons contribute to the lightness of the interface. &lt;/li&gt;
&lt;li&gt;Sidebars can now take up the whole height of the window.&lt;/li&gt;
&lt;li&gt;The window title is integrated into the toolbar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;A Finder window in macOS Big Sur...&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UROBocx5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ilice3dfh5v5k5j3j3y8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UROBocx5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ilice3dfh5v5k5j3j3y8.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;... and in Catalina.&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--V4qhKMaT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lbaab3wqldmkxitevdeg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V4qhKMaT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lbaab3wqldmkxitevdeg.png" alt=""&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;An app can now specify an app-specific accent color, which is used for buttons, selections, and in sidebars. Selections have a new, rounded look, and many controls have been redesigned. Sheets have also been redesigned, now looking like modal popups, instead of folding down from the bottom edge of the toolbar.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Big Sur accent color, rounded selections...&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mWQTf7N1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vvv5xcfuewxd9qfi1bnv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mWQTf7N1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vvv5xcfuewxd9qfi1bnv.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;... and a Big Sur sheet.&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gWcKe0e0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/px832efwlk0e3jlknd55.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gWcKe0e0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/px832efwlk0e3jlknd55.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SF Symbols, a library of icons made by Apple previously available in iOS, is now included and used in macOS. These icons can be used in toolbars, sidebars and elsewhere.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OFNOA0L2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d0tdabqri7sji2x4yo2j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OFNOA0L2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d0tdabqri7sji2x4yo2j.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;App icons get a new style as well, with all icons now using a rounded rectangle shape. While the icons have been updated to correspond more closely to their iOS counterparts, they do retain some macOS touches. Traditionally, app icons in macOS have featured a more realistic style than in iOS, and many Big Sur icons sport quite a bit of detail.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Big Sur app icon design moving closer to iOS.&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YoN4q5X4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xiou05662r8c1p6xs9px.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YoN4q5X4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xiou05662r8c1p6xs9px.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are many more changes in macOS Big Sur than covered here. The dock is redesigned, as is the notification center, and there is a new control center (another change brought over from iOS). Menus look different, there are new system sounds, and more. In fact, along with the news of the switch to Apple Silicon — Apple-made processors — for Mac hardware, these changes were enough for Apple to decide to turn up the version number for macOS Big Sur to 11! Catalina, the previous version of macOS, has the version number 10.15, while macOS Big Sur is known as version 11.0.&lt;/p&gt;

&lt;h1&gt;
  
  
  Changes in Tower
&lt;/h1&gt;

&lt;p&gt;If you ask us, part of what makes Tower great is the fact that it’s a native Mac app. Not only does this provide the best performance, but also the best integration with the operating system — the environment in which the app is used. As macOS users generally update quickly, it’s important that Tower adapts the design language of the latest macOS version. Of course, this can’t mean that Tower suddenly looks out-of-place on previous versions — while some changes can apply both to old and new macOS versions, some user interface changes should be restricted to users running the latest update. We’ve been hard at work updating Tower to take advantage of what macOS has to offer, and we think the result is a Git client that looks and feels better than ever!&lt;/p&gt;




&lt;p&gt;At first glance, you’ll notice that Tower adapts the full-height sidebar look of macOS Big Sur. This change doesn’t only affect the sidebar: it has consequences for the toolbar, the window title and the navigation bar. The buttons in the toolbar, pushed to the right, now share space with the window title and with elements from the navigation bar, like the clone button. The navigation bar itself has been removed, for a cleaner look. The services and bookmarks icons, previously in the navigation bar, now show up in the main toolbar, at the top of the new full-height sidebar.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tower 6 running on Big Sur...&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5bhWUBGw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/isiibjbsuey8e7xy871h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5bhWUBGw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/isiibjbsuey8e7xy871h.png" alt=""&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;em&gt;... and on Catalina.&lt;/em&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rtLUqqDq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hgdzwnljgnc8z8pxeb6j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rtLUqqDq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hgdzwnljgnc8z8pxeb6j.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Big Sur comes with a new look for selections, with rounded corners and different spacing. Naturally, Tower adopts these, except for in some places where rounded selections wouldn't make visual sense.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--J_aLL27x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/umj8jsr1hx11lvflte22.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--J_aLL27x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/umj8jsr1hx11lvflte22.png" alt=""&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Icons have been updated: we now use SF symbols along with some custom ones in the sidebar, the toolbar and in the quick actions popup. These icons have a lighter look than the ones previously used. In addition, the sidebar icons and selections now use the system accent color, so if you go into your macOS preferences and change the accent color, you’ll see your choice reflected in Tower’s sidebar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aJ6rqjpX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7cwhvmjvf7xuf434y8mt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aJ6rqjpX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7cwhvmjvf7xuf434y8mt.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A change which shows up on older macOS versions as well concerns the remote activity area. This area, showing ongoing pushes and fetches, for example, used to be visible all the time. Now, it only shows up when there are actual remote activities going on, otherwise, it stays out of the way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cNl4DW7P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/citjm8yh0gf08nw7fsq6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cNl4DW7P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/citjm8yh0gf08nw7fsq6.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, our app icon now adapts the rounded-rectangle shape of other Big Sur apps.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rG41AlDd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cxu3226h7r0o9v4j9rob.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rG41AlDd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cxu3226h7r0o9v4j9rob.png" alt=""&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Of course, this is just an overview. There are a lot of changes beyond the main ones described here. Positioning and spacing has been adjusted throughout the app, as have the colors of graph lines, badges and file statuses. The preferences window has been rewritten in order to facilitate easier updates and changes in the future. Tower has been recompiled and optimized for running on Apple Silicon. All in all, we are very happy with how &lt;a href="https://www.git-tower.com/blog/tower-mac-6/"&gt;Tower Big Sur&lt;/a&gt; turned out — we think this is the best-looking, most usable version of Tower yet!&lt;/p&gt;

</description>
      <category>git</category>
      <category>macos</category>
      <category>ux</category>
      <category>design</category>
    </item>
    <item>
      <title>9 Reasons Why Code Breaks</title>
      <dc:creator>Tobias Günther</dc:creator>
      <pubDate>Tue, 16 Feb 2021 08:26:14 +0000</pubDate>
      <link>https://dev.to/gittower/9-reasons-why-code-breaks-13kh</link>
      <guid>https://dev.to/gittower/9-reasons-why-code-breaks-13kh</guid>
      <description>&lt;h3&gt;
  
  
  1. Code is Untested
&lt;/h3&gt;

&lt;p&gt;Changing code in one place all too often breaks code in a (seemingly) unrelated place. No matter how experienced you might be: you won't be able to predict the possible side effects that code changes can have. That's what gives our jobs that "thrilling touch"...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Back your code with &lt;strong&gt;automated tests&lt;/strong&gt;!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  2. Code Does Not Report Errors
&lt;/h3&gt;

&lt;p&gt;You won't easily become aware of all your application's problems: some will only surface in very rare circumstances or with seldom used features. Although you cannot &lt;em&gt;prevent&lt;/em&gt; or &lt;em&gt;foresee&lt;/em&gt; all problems, you should at least make sure you're made aware as they &lt;em&gt;happen&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Use &lt;strong&gt;exception reporting&lt;/strong&gt; mechanisms, e.g. through services like &lt;a href="https://appcenter.ms"&gt;AppCenter&lt;/a&gt; or &lt;a href="https://airbrake.io/"&gt;Airbrake.io&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  3. Code Remains Isolated too Long
&lt;/h3&gt;

&lt;p&gt;Developing and keeping unfinished code separate from your production code is a sign of good breeding. However, not keeping your feature code &lt;em&gt;up-to-date&lt;/em&gt; with other important development in your project will cause problems. Because the later and less often you integrate your new code with the rest of your project, the higher the risk of things not being compatible.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Integrate often! Make &lt;strong&gt;continuous integration&lt;/strong&gt; part of your development workflow.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  4. Code is Developed in Isolation
&lt;/h3&gt;

&lt;p&gt;"Mike is the only one who knows this part of the code." And as it stands, Mike just started his 6-week vacation in the Himalaya... When code is developed by a single person in isolation, that code is fully dependent on that person. Whenever the developer is on vacation, sick, or busy with other stuff, that critical bug can't be fixed or that feature can't be added.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Consider &lt;strong&gt;pair programming&lt;/strong&gt; and/or regular &lt;strong&gt;code reviews&lt;/strong&gt; to share "code ownership".&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  5. Code Solves Problems That Aren't There
&lt;/h3&gt;

&lt;p&gt;Every piece of code solves a problem. And ideally, it should only solve a problem you &lt;em&gt;have&lt;/em&gt; (or are very likely to have). Of course, an endless number of other problems can be imagined... but trying to solve them when you're not likely to actually &lt;em&gt;have&lt;/em&gt; them will make your code more complex than necessary.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Make sure you &lt;strong&gt;don't overengineer&lt;/strong&gt;. Keep things as simple as possible.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  6. Code Reinvents the Wheel
&lt;/h3&gt;

&lt;p&gt;Any time you're looking at a programming problem, chances are that someone else has had the same problem before. And if you're lucky, the problem has not only been solved in a good enough way - but the solution has also been published. In that case, trying to write this code yourself would be the classic reinvention of the wheel - and a waste of your precious time.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Keep your eyes open for good &lt;strong&gt;third-party libraries&lt;/strong&gt; that have stood the test in other projects already.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  7. Code Depends on too Many External Pieces
&lt;/h3&gt;

&lt;p&gt;While external libraries can lighten your workload, they can (unfortunately) also bite you: when they introduce bugs, when they increase loading time, when their development is discontinued, when you simply have too many of them in your project to keep an overview...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Use &lt;strong&gt;third-party libraries&lt;/strong&gt; only when you're convinced that they are of high quality - and you really need them.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  8. Code is Not Actively Maintained
&lt;/h3&gt;

&lt;p&gt;Code rots. It's a sad but true fact. While some parts in a project change and evolve, others are left behind. These parts become liabilities over time. For example, because framework features became obsolete; or because the new code's demands aren't satisfied anymore.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Schedule time for regular &lt;strong&gt;refactorings&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  9. Code is Not Properly Version-Controlled
&lt;/h3&gt;

&lt;p&gt;Although most teams nowadays &lt;em&gt;use&lt;/em&gt; a version control system like Git, they often &lt;em&gt;don't&lt;/em&gt; use its full potential! Git has much more to offer than just "commit, pull, and push". Learning the more advanced stuff (from Interactive Rebase to Git's many "undo" features) can improve the quality of a code base tremendously!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Go beyond the basics and learn to use the more &lt;strong&gt;advanced features of Git&lt;/strong&gt;!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;If you want to take No. 9 - your Git knowledge - to the next level, I have a couple of tips for you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://git-tower.com/learn/git/ebook/?utm_source=devto&amp;amp;utm_medium=guestpost&amp;amp;utm_campaign=reasons-why-code-breaks"&gt;Learn version control with Git&lt;/a&gt;, a beginner-friendly online book.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://git-tower.com/learn/git/first-aid-kit/?utm_source=devto&amp;amp;utm_medium=guestpost&amp;amp;utm_campaign=reasons-why-code-breaks"&gt;First Aid Kit for Git&lt;/a&gt;, a series of short videos on how to undo mistakes.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://git-tower.com/learn/cheat-sheets/git/?utm_source=devto&amp;amp;utm_medium=guestpost&amp;amp;utm_campaign=reasons-why-code-breaks"&gt;Git Cheat Sheet&lt;/a&gt;, a nice overview of the most important commands.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>productivity</category>
      <category>webdev</category>
      <category>github</category>
    </item>
    <item>
      <title>How We Work on the Tower Git Client</title>
      <dc:creator>Kristian Lumme</dc:creator>
      <pubDate>Tue, 02 Feb 2021 09:44:58 +0000</pubDate>
      <link>https://dev.to/gittower/how-we-work-on-the-tower-git-client-15gh</link>
      <guid>https://dev.to/gittower/how-we-work-on-the-tower-git-client-15gh</guid>
      <description>&lt;p&gt;The team behind the &lt;a href="https://www.git-tower.com/"&gt;Tower Git client&lt;/a&gt; has been fully remote since 2015. During this time, we've faced the challenges of getting things done without sharing an office, but we've also seen the benefits. Working on Tower and associated tasks like support, marketing and websites in a completely distributed team has given us ample opportunity to develop our culture, and we've come to a few insights about how to work effectively remotely. We've had a post on how we work in the pipeline for some time and, as current world circumstances are bringing discussion on remote work to the forefront, we figured this would be a good time to share some thoughts and tips.&lt;/p&gt;

&lt;h1&gt;
  
  
  Culture and Values
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;"The best way to find out if you can trust somebody is to trust them."&lt;br&gt;
&lt;small&gt;— Ernest Hemingway&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Any discussion of our culture has to start with trust. Trusting the people on the team is the foundation of our other habits, from asynchronous communication to self-direction. Some managers freak out if they don’t micromanage people — they feel they're not in control. We don't want to work in an environment where people only do things because they fear the consequences if they don’t. Finding people that care about what they are doing and who take pride in the accomplishments of the team is of paramount importance.&lt;/p&gt;

&lt;p&gt;The rest follows quite naturally from the foundation of trust. We’re a small company and everyone is welcome to contribute their ideas and comments when it comes to what to work on. Given agreement on the most important tasks to focus on at the moment, people are expected to manage their own time, attention and priorities.&lt;/p&gt;

&lt;p&gt;As mentioned, we eschew the “always available” culture and do asynchronous communication for the most part — we want most time to be available for getting things done, not taken up by responding to communication or sitting in meetings. If there is a truly urgent problem that needs immediate attention — like the website being down — we switch channels, to phone for example. In a similar vein, we are “offline by default”. This doesn't mean that none of us are connected to the internet (though some ISPs would argue differently); rather, it means that our default mode is to be working away without the distraction of having to respond to everything that comes up, or having to appear to be “online”.&lt;/p&gt;

&lt;p&gt;Finally, we stick to a forty-hour work week, expecting people to put in their focused time and then leave work behind for the day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Expectations
&lt;/h2&gt;

&lt;p&gt;When it comes to culture, we find that setting expectations is important! We document our expectations and choose tools that reinforce them. Knowing, for example, that urgent problems will be communicated through an appropriate medium helps to encourage the default mode of asynchronous communication in day-to-day work. Most importantly, we try to live by our word. If everyone around you responds to all communication in three seconds flat, &lt;em&gt;that's the culture&lt;/em&gt;, not whatever the document says. Finding that others embrace these principles makes you comfortable doing so as well.&lt;/p&gt;

&lt;p&gt;Needless to say, we didn’t have everything figured out regarding distributed culture coming out of the gate. On the contrary, like probably every other company making the switch from co-located to remote work, we were stuck in our old ways to begin with. This included undocumented workflows, many all-hands meetings but no recurring formats, synchronous communication, and a lack of tools. The processes outlined here are something that we’ve developed through the years, and that we expect to continue developing in the future.&lt;/p&gt;



&lt;h1&gt;
  
  
  Tools and Software
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;“To the man who only has a hammer, everything he encounters begins to look like a nail.”&lt;br&gt;
&lt;small&gt;— Abraham Maslow&lt;/small&gt;&lt;/p&gt;


&lt;/blockquote&gt;

&lt;p&gt;Technology is what allows us to implement remote work in the first place. Naturally, we use a large number of different services and applications, including but far from limited to &lt;a href="https://twist.com/"&gt;Twist&lt;/a&gt;, email, &lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt;, &lt;a href="https://asana.com/"&gt;Asana&lt;/a&gt;, &lt;a href="https://zoom.us/"&gt;Zoom&lt;/a&gt;, &lt;a href="https://www.atlassian.com/software/confluence"&gt;Confluence&lt;/a&gt;, &lt;a href="https://calendly.com/"&gt;Calendly&lt;/a&gt;, and &lt;a href="https://gsuite.google.com/"&gt;Google G Suite&lt;/a&gt; to get our work done.&lt;/p&gt;

&lt;p&gt;What tools you use is not the most important thing, but you can choose tools that align with and reinforce your culture — or clash with it! As an example, though we’ve used Slack in the past, we now use Twist as a team chat tool. Twist does not show online/offline indicators or who has read a particular message. It does allow for organisation of topics and gives you control over who gets notified for a particular message. This alleviates the feeling that you need to respond right away and helps you find the important points in a discussion even at a later date.&lt;/p&gt;



&lt;h1&gt;
  
  
  Challenges
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;“With freedom comes responsibility.”&lt;br&gt;
&lt;small&gt;— Eleanor Roosevelt&lt;/small&gt;&lt;/p&gt;


&lt;/blockquote&gt;

&lt;p&gt;When it comes to working together, not seeing each other in person can create friction in a variety of ways. Sharing and understanding current status, progress and any blockers takes deliberate communication. Through text communication or even video chats, communicating and reading emotional state can be hard. A comment that comes off as friendly or joking in person might come across as blunt in an email, and it’s hard to gauge if a person needs some support with what they’re doing or if they’re happily working away and best left alone for the moment. Learning to communicate effectively through text is a requirement — this may present a challenge, but may also cultivate clearer and more thoughtful communication.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connecting People
&lt;/h2&gt;

&lt;p&gt;In addition to the professional aspect, only meeting your colleagues through text communication, with the occasional video chat, can feel challenging on a personal level. In short, remote work can feel lonely! You may not be quite up-to-date on what’s happening in the life of the people you work with. We do a few things to alleviate this, including peer 1-on-1s and weekly check-ins... but the truth is that in a distributed team, you have to be deliberate about nourishing your personal connections outside work, as you’re not going to get quite the same personal contact on a daily basis that you would get in a co-located team.&lt;/p&gt;

&lt;p&gt;Nevertheless, we do try to combat these issues by meeting in person three times per year (in non-COVID times, that is)! The get-togethers are great opportunities to get to know each other a little better, and we find that the better you know the people you work with, the easier communication becomes. When it comes to day-to-day communication, we also find that too much is better than too little. We try to be open about what’s going on in our lives and our work, including the challenges — not only does sharing these things with your peers feel good, but it also helps them understand where your mind is at.&lt;/p&gt;

&lt;h2&gt;
  
  
  Discipline
&lt;/h2&gt;

&lt;p&gt;People have joined the team with varying amounts of remote-work experience. Regardless of at what point in your life you start working remotely, there is a learning phase. When working at a dedicated office, the start and end of your workday are naturally delineated and the environment provides some discipline by itself. When working from home, you quickly find that you need to learn that discipline, and that if you don’t set routines for yourself, there will be none. The routines help establish boundaries between work and life outside of it. As you’re largely your own manager, organizing your own time and tasks is a must.&lt;/p&gt;

&lt;p&gt;If you have kids or other family members around, it may be difficult for them to understand that you are present but not available for interaction. Personal relationships may require more effort, as staying inside becomes easier. The same goes for physical movement — it’s easy to underestimate how much commuting to an office makes you move around but if you spend all day, every day on your couch, you’ll notice the difference!&lt;/p&gt;



&lt;h1&gt;
  
  
  Benefits
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;“You mind putting on some pants? I find it a little weird I have to ask twice.”&lt;br&gt;
&lt;small&gt;— Phil, The Hangover&lt;/small&gt;&lt;/p&gt;


&lt;/blockquote&gt;

&lt;p&gt;The freedom of being able to choose where and when you work is a benefit to a degree which really can’t be overstated. Some people are more productive in the mornings, others in the evenings, and as our many team members with kids can attest to, being able to structure your day to give you lots of quality time with your family members is priceless! Having complete control over your working environment (well, apart from aforementioned kids…) is also very helpful. There’s also the benefit of not having a commute, which can save you a lot of time per day.&lt;/p&gt;

&lt;p&gt;As previously mentioned, in our distributed team, you take on a lot of the responsibility for managing yourself and taking ownership of your projects. The responsibility can be challenging, but also communicates trust and inspires you to bring your best. Owning a project makes it more meaningful to you than if you were just handed task after task from someone else, without much say about which problems to solve and how to solve them.&lt;/p&gt;

&lt;h2&gt;
  
  
  People and Processes
&lt;/h2&gt;

&lt;p&gt;With a co-located team, a company is limited to finding employees among those living in or willing to relocate to a specific area. Remote work greatly increases the available talent pool, as you’re basically looking for people from the whole world. In practice, time zones are a consideration, as it’s helpful to have a bit of everyone's workday overlap, but with some flexibility you still have a lot of places to choose from!&lt;/p&gt;

&lt;p&gt;Working remotely also helps you document processes and decisions — simply because you have no other choice! This can bring clarity and thoughtfulness to processes. The fact that everything needs to be written down may feel like extra work initially, but very quickly, you find that it saves a great deal of effort. In addition, the documentation is immensely useful when onboarding new members of the team.&lt;/p&gt;

&lt;p&gt;How about cost? Not necessarily, though this is a common perception; while not having an office is a cost saving in itself, the costs for travel and get-togethers along with some extra tooling for remote work add up so that reduced costs are not necessarily a benefit of being fully remote.&lt;/p&gt;



&lt;h1&gt;
  
  
  Final Words
&lt;/h1&gt;

&lt;p&gt;A common theme among the challenges and benefits mentioned above is that remote work forces you to be deliberate about many things that happen by themselves in a co-located workspace. Routines and work/life boundaries must be constructed with intent. Communication, whether about work or something personal, takes effort and care. The same goes for personal connections, status updates and even exercise. However, having to think about these things explicitly sooner rather than later may also be very useful! Being intentional up-front instead of having processes and decisions “just happen” helps with clarity and with creating good habits, and may also make any problems apparent sooner. This way, many obstacles can be turned into assets.&lt;/p&gt;

&lt;p&gt;That’s about it for this look at the way we work on Tower. Remote work certainly brings its challenges, but for us, this is still an amazing way to work. A culture based on trust reduces overhead and inspires everyone to take responsibility for moving things forward. Self-direction and self-motivation are a must, as are building routines, nourishing your personal connections outside work and taking care of your health.&lt;/p&gt;

&lt;p&gt;If there’s some aspect of our work culture you’re interested in hearing more about, feel free to reach out — maybe there is material for another post looking at some topic in more detail.&lt;/p&gt;

&lt;p&gt;Until next time, hope you are all staying safe and looking out for each other!&lt;/p&gt;

</description>
      <category>git</category>
      <category>remote</category>
      <category>remotework</category>
      <category>culture</category>
    </item>
    <item>
      <title>Become a Better Programmer: 5 Essential Methods at a Glance</title>
      <dc:creator>Tobias Günther</dc:creator>
      <pubDate>Wed, 27 Jan 2021 08:35:21 +0000</pubDate>
      <link>https://dev.to/gittower/become-a-better-programmer-5-essential-methods-at-a-glance-25bh</link>
      <guid>https://dev.to/gittower/become-a-better-programmer-5-essential-methods-at-a-glance-25bh</guid>
      <description>&lt;h2&gt;
  
  
  1. Unit Testing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; Every programmer has experienced something like this: you change a bit of code in one corner, and in a (seemingly) unrelated corner, something breaks! The bitter truth is: both new and changed code will inevitably contain bugs. Use automated tests that help you keep old code stable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep in mind:&lt;/strong&gt; You can also go one step further and write tests &lt;em&gt;before&lt;/em&gt; your actual code. This can give you a whole new perspective on how to approach problems!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read more:&lt;/strong&gt; XP on &lt;a href="http://www.extremeprogramming.org/rules/unittests.html" rel="noopener noreferrer"&gt;Unit Tests&lt;/a&gt; and &lt;a href="http://www.extremeprogramming.org/rules/testfirst.html" rel="noopener noreferrer"&gt;Test-Driven Development&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Code Review
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; Code that is ever only seen by a single programmer in your team is dangerous code: if that person gets sick or leaves your team, no one knows how this piece of your software really works. Additionally, no matter how great and experienced that developer is: it might be that he overlooked something, implementing only the second best solution.&lt;/p&gt;

&lt;p&gt;These problems can easily be avoided by always having team members approve each other's code. It's both a quality control as well as a means to create collective ownership of your project's code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep in mind:&lt;/strong&gt; If pair programming (see below) is already an integral part of your workflow, you might not need additional code reviews!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read more:&lt;/strong&gt; Code Review on the blogs of &lt;a href="https://www.ibm.com/developerworks/rational/library/11-proven-practices-for-peer-review/" rel="noopener noreferrer"&gt;IBM&lt;/a&gt; and &lt;a href="http://www.codinghorror.com/blog/2006/01/code-reviews-just-do-it.html" rel="noopener noreferrer"&gt;Jeff Atwood&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Pair Programming
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; Pair programming is an ideal tool to share knowledge in a team. Having a junior and a senior developer sitting side-by-side is the best way for the junior to learn. And since teaching is a great way to sharpen your own skills, even the senior can benefit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep in mind:&lt;/strong&gt; Make sure that each person gets in front of the keyboard on a rotating basis. It shouldn't become a "I teach, you listen" event.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read more:&lt;/strong&gt; XP about &lt;a href="http://www.extremeprogramming.org/rules/pair.html" rel="noopener noreferrer"&gt;Pair Programming&lt;/a&gt;, Martin Fowler on &lt;a href="http://martinfowler.com/bliki/PairProgrammingMisconceptions.html" rel="noopener noreferrer"&gt;Pair Programming Misconceptions&lt;/a&gt;, WikiHow on &lt;a href="http://www.wikihow.com/Pair-Program" rel="noopener noreferrer"&gt;Pair Programming&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Keep it Simple
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; Planning for the unlikely makes code unnecessarily complex. Don't try to foresee your project's requirements in two years from now - too many things can (and &lt;strong&gt;will&lt;/strong&gt;) change! You would waste time on an overly complex solution for a problem that proves to be different than you thought.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep in mind:&lt;/strong&gt; Keeping it simple shouldn't be confused with "quick and dirty". You still have to work thoroughly and carefully!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read more:&lt;/strong&gt; &lt;a href="http://people.apache.org/~fhanik/kiss.html" rel="noopener noreferrer"&gt;KISS&lt;/a&gt; on apache.org&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Design Patterns
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; At its core, most programming problems belong to one of only a few general categories. These general problems have already been solved thousands of times - and are well-documented in a couple of "design patterns". Step back from the problem in front of you. And you'll be able to apply a proven best practice instead of reinventing the wheel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep in mind:&lt;/strong&gt; Applying design patterns shouldn't become a religion. Sometimes, all that's really necessary are a few lines of simple code...&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read more:&lt;/strong&gt; A classic &lt;a href="http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612" rel="noopener noreferrer"&gt;design patterns book&lt;/a&gt;, &lt;a href="http://net.tutsplus.com/articles/general/a-beginners-guide-to-design-patterns/" rel="noopener noreferrer"&gt;A beginner's guide to design patterns&lt;/a&gt; on net.tutsplus.com&lt;/p&gt;

&lt;h2&gt;
  
  
  (Bonus) 6. Version Control with Git
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Why?&lt;/strong&gt; Git and version control are often underestimated: being proficient with Git has the power to make you a better programmer - and help you build a better code base!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep in mind:&lt;/strong&gt; Git is about more than just "commit, push, pull". Take its many "undo" features and you'll quickly understand how helpful it can be!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read more:&lt;/strong&gt; A completely free online book on &lt;a href="https://git-tower.com/learn/git/ebook/?utm_source=devto&amp;amp;utm_medium=guestpost&amp;amp;utm_campaign=become-a-better-programmer" rel="noopener noreferrer"&gt;Learning version control with Git&lt;/a&gt; and the &lt;a href="https://git-tower.com/learn/git/first-aid-kit/?utm_source=devto&amp;amp;utm_medium=guestpost&amp;amp;utm_campaign=become-a-better-programmer" rel="noopener noreferrer"&gt;First Aid Kit&lt;/a&gt;, a series of short videos on how to undo mistakes in Git.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://git-tower.com/learn/git/ebook/?utm_source=devto&amp;amp;utm_medium=guestpost&amp;amp;utm_campaign=become-a-better-programmer" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4kxu1socpgz8h1aqdsln.png" alt="wv1tlckw577joxxkemdw"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>programming</category>
      <category>testing</category>
    </item>
    <item>
      <title>First Aid Kit for Git</title>
      <dc:creator>Tobias Günther</dc:creator>
      <pubDate>Wed, 02 Dec 2020 08:49:22 +0000</pubDate>
      <link>https://dev.to/gittower/first-aid-kit-for-git-253a</link>
      <guid>https://dev.to/gittower/first-aid-kit-for-git-253a</guid>
      <description>&lt;p&gt;Here's the good news: &lt;strong&gt;Git allows you to undo almost any mistake!&lt;/strong&gt; 🤩&lt;br&gt;
But the bad news is: &lt;strong&gt;You have to know the right commands &amp;amp; tools!&lt;/strong&gt; 😩&lt;/p&gt;

&lt;p&gt;To help you learn the various ways to save your neck, I've compiled a series of &lt;strong&gt;17 short videos&lt;/strong&gt; and a handy cheat sheet - &lt;strong&gt;free&lt;/strong&gt; to download! &lt;/p&gt;

&lt;p&gt;You'll learn how to...&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;...correct and fix your very last commit&lt;/li&gt;
&lt;li&gt;...discard uncommitted changes in your working copy&lt;/li&gt;
&lt;li&gt;...undo and revert an old commit&lt;/li&gt;
&lt;li&gt;...return to a previous version of your project&lt;/li&gt;
&lt;li&gt;...restore a deleted branch or commit&lt;/li&gt;
&lt;li&gt;...deal with merge conflicts like a pro&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Go ahead and &lt;a href="https://www.git-tower.com/learn/git/first-aid-kit/?utm_source=devto&amp;amp;utm_medium=guestpost&amp;amp;utm_campaign=first-aid-kit"&gt;download my "First Aid Kit for Git" for free&lt;/a&gt; and learn how to undo your mistakes like a Pro!&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Our Development Philosophy - Part 2: Collaboration &amp; Testing</title>
      <dc:creator>Julian Rothkamp</dc:creator>
      <pubDate>Tue, 01 Dec 2020 09:55:02 +0000</pubDate>
      <link>https://dev.to/gittower/our-development-philosophy-part-2-collaboration-testing-46lm</link>
      <guid>https://dev.to/gittower/our-development-philosophy-part-2-collaboration-testing-46lm</guid>
      <description>&lt;p&gt;There are lots of books about programming languages and frameworks - but only few resources that talk about "softer" topics like testing and collaboration. In larger projects, however, these topics can easily be make-or-break for your team's success!&lt;/p&gt;




&lt;p&gt;We learned in countless situations within our own team how important these skills really are: very often when things went wrong, it had been due to a lack of testing and/or collaboration. Here are some things we've learned while growing &lt;a href="https://www.git-tower.com?utm_source=devto&amp;amp;utm_medium=guestpost&amp;amp;utm_campaign=dev-philosophy-2"&gt;Tower&lt;/a&gt; to serve more than 100,000 users.&lt;/p&gt;




&lt;h2&gt;
  
  
  All Code Belongs to the Team
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZLJtKbYX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/r64v1ga5ss4w4gcbs4b8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZLJtKbYX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/r64v1ga5ss4w4gcbs4b8.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code is teamwork, not the work of any individual developer.&lt;/strong&gt; This also means that none of the code you've written belongs to you – it belongs to the team! Looking at code in this way is helpful and liberating for a couple of reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;It doesn't have to go your way.&lt;/strong&gt; After understanding that code always belongs to the team, it becomes obvious that we need to comply with coding standards and guidelines. Since it's not your code you can't just write it any way you fancy. It's a common code base, so common rules must be adhered.&lt;br&gt;
This should also make you more tolerant when looking at your colleagues' code. You might instinctively think of all the ways you would have done it differently. But again: it doesn't have to go your way, but your team's way. This can help a lot in making you more open-minded towards other solutions and approaches.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Everything is your problem.&lt;/strong&gt; When you spot a potential problem in the code, it doesn't really matter if it was your fault for not. Since all of the project's code belongs to the team – and you are part of this team – weak code from any source becomes your problem.&lt;br&gt;
Contrast this to an atmosphere where people are detached from their teams and their shared code: "this is not my problem" is an attitude that will never produce great products.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;You. You. You.&lt;/strong&gt; This is a simple reminder of our responsibilities as software developers: &lt;strong&gt;You&lt;/strong&gt; are responsible for writing code. Then, &lt;strong&gt;you&lt;/strong&gt; are also responsible for making it shippable or production ready. And of course, &lt;strong&gt;you&lt;/strong&gt; are responsible for fixing any problems with it.&lt;br&gt;
In our own team, where we don't have a dedicated quality assurance team, this reminded us that developers are not only responsible for writing down lines of code – but also for the quality of that code. This responsibility is nothing that you can duck out of or hand over to someone else.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Sharing Knowledge with Code Reviews
&lt;/h2&gt;

&lt;p&gt;Code reviews have a huge potential to lift your development team to new heights.&lt;/p&gt;

&lt;p&gt;Most obviously, discussing code in a review session can lead to a better solution than the original developer had had on her own. Two minds working together on the same problem will always have the chance to produce higher quality code.&lt;/p&gt;

&lt;p&gt;But other potential benefits of code reviews might be even more interesting. Shared ownership, for example, is crucial to reduce knowledge silos: whenever you find that only a single developer in your team knows a certain piece of code, you are at risk. Whenever this developer goes on holidays, gets sick, or maybe even leaves the company you'll be in trouble.&lt;br&gt;
But even if none of these situations occur: the fact that your team doesn't seem to have a truly shared code base is already telling. Have a look at the previous section and you'll understand why.&lt;/p&gt;

&lt;p&gt;Additionally, code reviews can solve the hairy problem of knowledge exchange. If, like most teams, you have a mixture of junior and senior developers, you will certainly want those junior developers to benefit from your experts' experience and knowledge. Code reviews are an excellent way to pass on knowledge in situations like these.&lt;/p&gt;

&lt;p&gt;And to make the process worthwhile for both sides (juniors and seniors), make sure your senior developers understand that both parties – the student and the teacher – will learn something on the way!&lt;/p&gt;




&lt;h2&gt;
  
  
  Not Everything Needs Improvement
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VRg9rzGi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/33c10y5vw0q1ztnyuk3j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VRg9rzGi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/33c10y5vw0q1ztnyuk3j.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since there is no such thing as a perfect solution, you could argue that everything can be improved. And you're probably right. But the interesting question is not if something can be improved – but rather if it's worthwhile to improve a certain part in your application.&lt;/p&gt;

&lt;p&gt;We know where our own product, &lt;a href="https://www.git-tower.com/?utm_source=devto&amp;amp;utm_medium=guestpost&amp;amp;utm_campaign=dev-philosophy-2"&gt;Tower&lt;/a&gt;, has its weak spots. And if time was infinite, we would probably polish and improve every single bit. But with time being a scarce resource for any team you will have to set priorities. If you don't, your product will not take the direction you want it to take - or it might very well take no direction at all.&lt;/p&gt;

&lt;p&gt;Being able to responsibly ponder if or if not to improve something really is an art. It takes years of experience and, in the best case, even conscious training. Saying no to a lot of things is a prerequisite for achieving anything of worth.&lt;/p&gt;

&lt;p&gt;True in life, and true in software development.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ask Questions
&lt;/h2&gt;

&lt;p&gt;When reading other people's code it's all too easy to assume that you would have done it better. On first encounter, this or that line might seem unnecessarily complex or even superfluous. And you might of course be right. But it's very hard to say because of one simple fact: you didn't actually &lt;em&gt;write&lt;/em&gt; the code.&lt;/p&gt;

&lt;p&gt;From our own experience, we know that even the simplest problem can really contain a surprising and infinite amount of complexity. Only when actually working on the problem – when picking it apart, thinking about possible solutions, side effects, etc. – will one be able to understand its scope.&lt;/p&gt;

&lt;p&gt;Therefore, when coming across a piece of code that makes you suspicious, it's a great ground rule to &lt;strong&gt;assume a good amount of hidden complexity&lt;/strong&gt;. From this point of view you can either dive deep into the code and try to understand it and the underlying problem – or you simply get into a conversation with your teammate(s) and ask some humble questions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Software is Only Complete with Tests
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ElIcqGRx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xq57xh0vne5xloask7bz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ElIcqGRx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xq57xh0vne5xloask7bz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unit tests are sometimes regarded as the icing on the cake. More appropriately, however, they would be better described as the cake's &lt;em&gt;base&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In smaller projects, you might get away without writing unit tests. In any project with just a slight amount of complexity, however, you will not. And, just as a side note, it's remarkable to see how many projects started simple and very soon became complex. So please don't act surprised.&lt;/p&gt;

&lt;p&gt;There are indeed countless reasons why unit testing is essential for us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Making big changes, safely and quickly.&lt;/strong&gt; In every larger project, you will have to perform refactorings at some point. But refactoring code without a decent amount of unit tests in place is a very frustrating experience: While fixing something you will often and inevitably break something else. Unit tests let you know when this happens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Releasing to the public, confidently.&lt;/strong&gt; If your application is shipped to paying customers, not having a solid unit test coverage should make you shiver every time you make a release.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better code through tests.&lt;/strong&gt; Writing good tests is one of the best preconditions to have good code in the end. This is because tests help you understand the problem you're trying to solve and create a simple, modular architecture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Up-to-date documentation.&lt;/strong&gt; In an ideal world, every important part of an application would be nicely documented. We would have wonderful, clean, and beautifully formatted documents that are a joy to read. And most importantly, we would update the documentation every time something in the code changes. Well... this is of course a fairytale.
But having up to date documentation in general does &lt;em&gt;not&lt;/em&gt; have to be a fairytale: unit tests can serve this purpose. Although probably not as &lt;em&gt;pleasant&lt;/em&gt; to read as dedicated documentation, they are (almost by definition) always up to date. This makes unit tests a very valuable and reliable source of documentation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good test &lt;em&gt;quality&lt;/em&gt; and good test &lt;em&gt;coverage&lt;/em&gt; of important code parts are mandatory for larger projects. It made us much more confident that we would always be able to deliver &lt;a href="https://www.git-tower.com?utm_source=devto&amp;amp;utm_medium=guestpost&amp;amp;utm_campaign=dev-philosophy-2"&gt;Tower&lt;/a&gt; with a high quality and that we would always be able to make changes (big and small) safely and effectively.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tests Make Development Faster
&lt;/h2&gt;

&lt;p&gt;At first glance, using a test-driven approach would seem to be time-consuming and slow down your progress. And indeed, writing good unit tests takes time.&lt;/p&gt;

&lt;p&gt;But over time, you will find that unit testing will in fact make you faster! For one thing, after thinking about your code design while writing a test, you will need less time to write the actual implementation code. You will have done a lot of the heavy lifting already by writing the tests.&lt;/p&gt;

&lt;p&gt;The other benefit that will make you a lot more effective in the long run is stability: the likelihood of breaking existing code when making changes is significantly reduced through tests. You will save countless hours of bug hunting that you can now invest in something more useful.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fixing by Testing
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BVXJb5sI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/q76yc7gc7cgqk1tw41bf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BVXJb5sI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/q76yc7gc7cgqk1tw41bf.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bug fixing should be inseparably connected with writing tests. Of course you could just track that bloody animal down and simply fix the code. However, I guess that a lot of you are painfully familiar with the term "regression": the annoying re-emergence of a bug that you were so confident to have fixed.&lt;/p&gt;

&lt;p&gt;If you want to make sure (and you should!) that a bug is fixed for good, there is only on proven way - by writing a test to safeguard this piece of code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Test Low-Level Components
&lt;/h2&gt;

&lt;p&gt;While producing a &lt;a href="https://www.git-tower.com?utm_source=devto&amp;amp;utm_medium=guestpost&amp;amp;utm_campaign=dev-philosophy-2"&gt;software product that is in daily use by almost 100,000 people&lt;/a&gt;, we learned a lot about errors. For one thing, we learned that they are an inevitable part of the business; especially with the diverse and complex system setups that Tower has to deal with, you cannot rule out and safeguard everything. But for another thing, we also learned &lt;em&gt;where&lt;/em&gt; errors mostly occured.&lt;/p&gt;

&lt;p&gt;In Tower (and most likely in a lot of other larger applications), most errors tend to occur in low level components. The good thing about this is that such components lend themselves very well to unit testing. In this area, a test-driven approach offers a huge chance to improve your application's overall stability and quality with a reasonable investment – by thoroughly testing low-level components.&lt;/p&gt;




&lt;h2&gt;
  
  
  Efficient Testing
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--u9LJSccU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jsgbonhr1w8t1aavtafw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--u9LJSccU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jsgbonhr1w8t1aavtafw.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In general, having a large amount of your code covered by unit tests is a good thing. However, if you ever hear a software developer brag about his "100% test coverage", you should be wary. Testing every single line of your application code might sound like something to strive for - but it really isn't!&lt;/p&gt;

&lt;p&gt;On the one hand, this would of course afford an infinite amount of time. Much more importantly, however, there &lt;em&gt;is&lt;/em&gt; in fact something like writing too many tests! At the latest, you will learn this when making a bigger refectoring: not only your code, but also your tests have to be maintained. When your code changes, your tests need to change, too.&lt;/p&gt;

&lt;p&gt;The crucial criteria is &lt;em&gt;value&lt;/em&gt;. Does the test bring you enough value to justify writing it? Typically, tests are of &lt;em&gt;low&lt;/em&gt; value if they test only very simple logic. In these cases, the burden of having to maintain the test outweighs the little value that it brings.&lt;/p&gt;

&lt;p&gt;Writing tests &lt;em&gt;efficiently&lt;/em&gt;, then, means preferring fewer high-value tests over many low value tests.&lt;/p&gt;




&lt;h2&gt;
  
  
  Test, Don't Run
&lt;/h2&gt;

&lt;p&gt;Manually testing a certain scenario in your application can really take a huge amount of time: you have to start the app, navigate your way to a certain view, and perform various additional actions to reproduce a certain scenario.&lt;/p&gt;

&lt;p&gt;Writing a unit test for a scenario will indeed afford some time initially. But very quickly, probably already after having to test this only a couple of times, running the test will be much faster than starting the whole application and testing your way through it manually.&lt;/p&gt;

&lt;p&gt;Besides being faster, however, the test will also provide better results in terms of quality and stability. In most cases, the initial effort is worth the long time benefits.&lt;/p&gt;




&lt;h2&gt;
  
  
  Writing Code is Only Half the Battle
&lt;/h2&gt;

&lt;p&gt;If you've read this far, I hope you agree with me: &lt;strong&gt;becoming a great software developer takes more than just writing code.&lt;/strong&gt; From testing to documentation and from ownership to communication, there's a lot to learn if you want to master the art of programming. &lt;/p&gt;

&lt;p&gt;Be sure to &lt;a href="https://www.git-tower.com/newsletter?utm_source=devto&amp;amp;utm_medium=guestpost&amp;amp;utm_campaign=dev-philosophy-2"&gt;join our free newsletter&lt;/a&gt; for more insights and advice on this exciting journey!&lt;/p&gt;

</description>
      <category>todayilearned</category>
      <category>programming</category>
      <category>productivity</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Understanding the Concept of Branches in Git</title>
      <dc:creator>Tobias Günther</dc:creator>
      <pubDate>Thu, 26 Nov 2020 07:47:13 +0000</pubDate>
      <link>https://dev.to/gittower/understanding-the-concept-of-branches-in-git-3a38</link>
      <guid>https://dev.to/gittower/understanding-the-concept-of-branches-in-git-3a38</guid>
      <description>&lt;p&gt;Using branches in your day-to-day work might very well prove to make you a better programmer or designer. Be that as it may, it's definitely one of the main reasons why Git is so highly respected. And although desktop GUIs like "&lt;a href="https://www.git-tower.com?utm_source=devto&amp;amp;utm_medium=guestpost&amp;amp;utm_campaign=understanding-the-concept-of-branches" rel="noopener noreferrer"&gt;Tower&lt;/a&gt;" make all of this a lot easier, it still makes sense to have a firm understanding of the underlying concepts!&lt;/p&gt;




&lt;p&gt;First of all, if you're coming from another version control system, I kindly ask you to forget the things you already know about branching &amp;amp; merging. It's true that Git hasn't invented this particular wheel: many other VCS also offer branching. However, Git's concepts in this area are absolutely unique when it comes to ease of use and performance.&lt;/p&gt;

&lt;p&gt;Now, let's look at why branches are so important.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working in Contexts
&lt;/h2&gt;

&lt;p&gt;In every project, there are always multiple different &lt;strong&gt;contexts&lt;/strong&gt; where work happens. Each feature, bugfix, experiment, or alternative of your product is actually a context of its own: it can be seen as its own "topic", clearly separated from other topics.&lt;/p&gt;

&lt;p&gt;This leaves you with an unlimited amount of different contexts. Most likely, you'll have at least one context for your "main" or "production" state, and another context for each feature, bugfix, experiment, etc.&lt;/p&gt;

&lt;p&gt;In real-world projects, work always happens in multiple of these contexts &lt;em&gt;in parallel&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;While you're preparing 2 new variations of your website's design (context 1 &amp;amp; 2)...&lt;/li&gt;
&lt;li&gt;you're also trying to fix an annoying bug (context 3).&lt;/li&gt;
&lt;li&gt;Besides, you also update some content on your FAQ pages (context 4), while...&lt;/li&gt;
&lt;li&gt;your teammate is working on a new feature for your shopping cart (context 5),...&lt;/li&gt;
&lt;li&gt;and another colleague is experimenting with a whole new login functionality (context 6).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A World Without Branches
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Not&lt;/strong&gt; working in clearly separated contexts can (and sooner or later &lt;strong&gt;will&lt;/strong&gt;) cause several problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What happens if your client likes variation 2 of the new design? In the meantime, a host of other changes have happened! How do you launch the new design while integrating all these other changes instead of losing them?&lt;/li&gt;
&lt;li&gt;What happens if the shopping cart feature became obsolete because the client changed his mind? How do you get all that unwanted code (and only that code!) out?&lt;/li&gt;
&lt;li&gt;What do you do if that new login functionality proves to be impossible to implement? It's already mingled with all of those other changes, being almost impossible to separate out!&lt;/li&gt;
&lt;li&gt;How can you avoid losing track? Most likely, you shouldn't be bothered with all the topics from all of your colleagues.
Things will start to get very confusing when you try to handle multiple topics in a single context:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2zydtbq8wncs9d2i9wsq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F2zydtbq8wncs9d2i9wsq.png" alt="one-context"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;A tempting workaround might  be to simply copy your complete project folder for each new context. But this only leaves you with other problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You circumvent your VCS, since those new folders won't be under version control.&lt;/li&gt;
&lt;li&gt;Not being version controlled, you can't easily share &amp;amp; collaborate with others.&lt;/li&gt;
&lt;li&gt;Integrating changes from one context into another (maybe your main context) is difficult and error-prone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To make a long story short: if your goal is to work professionally, you'll have to find a way to deal with multiple contexts in a professional manner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Branches to the Rescue
&lt;/h2&gt;

&lt;p&gt;You might have already guessed it: branches are what we need to solve these problems. Because a branch represents exactly such a context in a project and helps you keep it separate from all other contexts.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F18repx38nvbi4ncne3v7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F18repx38nvbi4ncne3v7.png" alt="multiple-contexts"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;This was an excerpt from my (&lt;strong&gt;completely free!!&lt;/strong&gt;) online book &lt;a href="https://www.git-tower.com/learn/git/ebook?utm_source=devto&amp;amp;utm_medium=guestpost&amp;amp;utm_campaign=understanding-the-concept-of-branches" rel="noopener noreferrer"&gt;"Learn Version Control with Git"&lt;/a&gt;. Feel free to read more if you want to understand &lt;em&gt;How branches can solve these problems&lt;/em&gt;, &lt;em&gt;How to create and manage them&lt;/em&gt;, &lt;em&gt;How to integrate changes between branches&lt;/em&gt; and &lt;em&gt;where remote branches come into play&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.git-tower.com/learn/git/ebook?utm_source=devto&amp;amp;utm_medium=guestpost&amp;amp;utm_campaign=understanding-the-concept-of-branches" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fhqcbk5vnzacvofekh007.png" alt="ebook-learn-version-control"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Our Development Philosophy - Part 1: Architecture, Design Patterns and Programming Principles</title>
      <dc:creator>Julian Rothkamp</dc:creator>
      <pubDate>Wed, 25 Nov 2020 06:59:22 +0000</pubDate>
      <link>https://dev.to/gittower/our-development-philosophy-part-1-architecture-design-patterns-and-programming-principles-7lj</link>
      <guid>https://dev.to/gittower/our-development-philosophy-part-1-architecture-design-patterns-and-programming-principles-7lj</guid>
      <description>&lt;p&gt;When software projects become bigger and more complex, you might reach a tipping point: one day, code quality becomes paramount. You can get away with easy fixes and a "quick &amp;amp; dirty" mindset in smaller projects. But as soon as complexity increases, you'll begin to feel sorry for every compromise you've made so far.&lt;/p&gt;




&lt;p&gt;We've certainly experienced these growing pains in our own journey - with &lt;a href="https://www.git-tower.com?utm_source=devto&amp;amp;utm_medium=guestpost&amp;amp;utm_campaign=dev-philosophy-1" rel="noopener noreferrer"&gt;Tower&lt;/a&gt; steadily growing to now serve 100,000 developers and designers. This post talks about some of the important things we've learned along the way.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;By the way: Part 2 of this series will soon follow. Be sure to &lt;a href="https://www.git-tower.com/newsletter?utm_source=devto&amp;amp;utm_medium=guestpost&amp;amp;utm_campaign=dev-philosophy-1" rel="noopener noreferrer"&gt;join our newsletter&lt;/a&gt; to be notified.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Applications Need Solid Foundations
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj1syz10dhq4enl1exp5q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fj1syz10dhq4enl1exp5q.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building even the smallest of software applications is a major investment for most companies.&lt;/strong&gt; Your team will spend days, weeks, months, and maybe even years building that application. But not only is this a huge one-time investment - you'll have to continue to put time and effort into it over its complete lifetime. Neither the coding nor the investment will stop when the application launches.&lt;/p&gt;

&lt;p&gt;Let's take our own product &lt;a href="https://www.git-tower.com?utm_source=devto&amp;amp;utm_medium=guestpost&amp;amp;utm_campaign=dev-philosophy-1" rel="noopener noreferrer"&gt;Tower&lt;/a&gt; as an example: we had worked for 12 months to develop version 1.0 and bring it to market. But in the six years since then, we have produced many times more code than the original product contained.&lt;br&gt;
This constant, never-ending maintenance and extension of an application means that its foundation becomes crucial. Much like with a house, it's not a clever idea to save some money by building just a cheap foundation.&lt;/p&gt;

&lt;p&gt;Logically, one of our biggest goals is to make extending and improving that application as easy and safe as possible. This is where &lt;strong&gt;application architecture&lt;/strong&gt; comes into play.&lt;/p&gt;

&lt;p&gt;Only a really good architecture will help us protect the huge investment that building an application means. We will explore in greater depth what "good" architecture means (in our humble opinion). But the main qualities you'll want to aim for are the same timeless classics in every project: solidity, maintainability, extensibility and scalability.&lt;/p&gt;

&lt;p&gt;Improving and refactoring an app's architecture will often seem like luxury - or maybe even like wasted time. But in reality, it should better be seen as a necessity, as a crucial and one of the most important duties of an experienced software engineer.&lt;/p&gt;

&lt;p&gt;When we ask ourselves if we should invest into architectural improvements, the answer is usually yes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Choosing the Boring Solution
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fovhz330cso14cw13ohow.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fovhz330cso14cw13ohow.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When solving a complex problem, it's sometimes very tempting to choose an &lt;em&gt;extraordinary&lt;/em&gt; solution. Not only will this solve the problem - but it will also impress your teammates and bring you everlasting glory. 🦄&lt;/p&gt;

&lt;p&gt;An even better solution, however, would probably be a boring one. One that is easy to understand, even for your junior colleagues. One that is well-known on your platform and language. One that is absolutely &lt;em&gt;not&lt;/em&gt; extraordinary.&lt;/p&gt;

&lt;p&gt;Using such a boring solution means that you're using simple vocabulary, which greatly increases the chances of everybody understanding you. This will make it a lot easier for everybody to follow along - including new team members (and yourself, a couple of weeks after you've written that code).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When in doubt, go with the boring solution.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Coding the Lego Way
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0enawlofg7dig34ozir2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F0enawlofg7dig34ozir2.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Trick question: if you had both modeling clay and Lego bricks available, what would you choose for building your application? Let's say you went with the modeling clay: pretty easy to shape, bright colors, strawberry taste - what more could you want? But the problems are inevitable as soon as you want to correct, extend, or improve something you've already built. There is no way to easily separate individual parts after you've mixed and mingled them.&lt;/p&gt;

&lt;p&gt;If you've chosen Lego bricks, on the other hand, subsequent changes are easy: the yellow "authentication" block isn't big enough? Just take it out and replace it with a bigger one. The green "export format" block needs to be extended with a PDF option? Just put an additional light green brick next to it.&lt;/p&gt;

&lt;p&gt;Modularity, the concept that the Lego bricks symbolize, is synonymous with extensibility, maintainability and longevity of your application. No matter which framework, language, or programming principle you prefer: always shoot for modularity in your code!&lt;/p&gt;




&lt;h2&gt;
  
  
  Aiming for Simplicity
&lt;/h2&gt;

&lt;p&gt;Acronyms FTW! Car enthusiasts might now think of BMW, but software developers should think of &lt;strong&gt;KISS&lt;/strong&gt; and &lt;strong&gt;YAGNI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;"&lt;strong&gt;Keep it simple, stupid&lt;/strong&gt;" should remind us that the simple solution will always beat the overengineered solution. The reasons why this is true are almost endless. And they might be easier to understand when looking at the opposite: complex code.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complex code is a perfect hiding place for mistakes.&lt;/li&gt;
&lt;li&gt;Complex code is hard to understand, for your coworkers and yourself.&lt;/li&gt;
&lt;li&gt;Complex code cannot easily be extended.&lt;/li&gt;
&lt;li&gt;Complex code cannot be reused. And, last but certainly not least, writing complex code will cause your teammates to brand you as an outlaw.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a simpler solution seems sufficient right now, you should always aim for it.&lt;/p&gt;

&lt;p&gt;When you realize that your solution isn't really necessary at all, you should drop it. This is what YAGNI is about - "&lt;strong&gt;You ain't gonna need it&lt;/strong&gt;" reminds us to stay modest when planning the volume and scope of our implementations. Will users really need this feature? Will they need this option &lt;em&gt;within&lt;/em&gt; a feature? These questions of course will translate to our code: will we really need that class / module / routine?&lt;/p&gt;




&lt;h2&gt;
  
  
  Constantly Redefining the Term "Edge Case"
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzz9huo0woiy4ln8olhae.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fzz9huo0woiy4ln8olhae.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This point might not apply to every application in the same extent. But with &lt;a href="https://www.git-tower.com?utm_source=devto&amp;amp;utm_medium=guestpost&amp;amp;utm_campaign=dev-philosophy-1" rel="noopener noreferrer"&gt;Tower&lt;/a&gt; being used by over 100,000 people worldwide, we constantly had to redefine the term "edge case" for us.&lt;/p&gt;

&lt;p&gt;If your application serves a large user base, you will inevitably have to be more thorough when thinking about how people will use it. Things that rarely occur with a thousand users might become a daily event for 100,000 users.&lt;/p&gt;

&lt;p&gt;This makes defining the term "edge case" a very individual matter: each and every team has to define for themselves what &lt;em&gt;they&lt;/em&gt; consider an edge case. Also, be prepared to constantly redefine this term as your user base grows: Your current edge cases become too common to qualify for that label; and, at the same time, new edge cases will appear.&lt;/p&gt;

&lt;p&gt;It pays off to invest a little more time thinking about these things before jumping into implementation. This way, you can include graceful handling of these cases already when writing the original implementation. This is much easier than having to catch up on it a couple of weeks later - when both your memory of the problem isn't fresh anymore and when the innocent little edge case has somehow turned out to be a full-blown bug.&lt;/p&gt;




&lt;h2&gt;
  
  
  Creating Good APIs
&lt;/h2&gt;

&lt;p&gt;I'm sure you've used a third-party API at some point in your dev career - for example to create new contacts in your CRM, to send emails through a newsletter service, or to virtually do anything else with a third-party service.&lt;/p&gt;

&lt;p&gt;If you've interacted with a couple such APIs, you will certainly have noticed some differences between them: using one was probably more pleasant than the other. It's easy to notice which API was designed thoroughly, by an experienced developer, and probably with a lot of effort and thought. And it's just as easy to be frustrated with an API that was designed in a poor and sloppy way. The former was probably a joy to use, while the latter was probably... not.&lt;/p&gt;

&lt;p&gt;Since the effects are so obvious, most developers tend to quickly agree that it's almost a duty to design &lt;em&gt;public&lt;/em&gt; APIs in a careful and thought-out way. Nobody wants to work with a crappy API - and nobody wants to burden other developers with using &lt;em&gt;their&lt;/em&gt; API being crappy.&lt;/p&gt;

&lt;p&gt;Modern software design puts great emphasis on the concept of "application programming interfaces". However, as most developers already know, the concept goes a lot deeper and is not exclusive to a &lt;em&gt;public&lt;/em&gt; interface. Instead, you should build APIs inside your application, for internal use, too.&lt;/p&gt;

&lt;p&gt;Approaching these &lt;em&gt;internal&lt;/em&gt; APIs in exactly the same way you'd create a &lt;em&gt;public&lt;/em&gt; one can make a huge difference: your colleagues (and you) will want to interact with this part of your application. Making the interaction as easy as possible for these people is one of the best goals you can have.&lt;/p&gt;

&lt;p&gt;An easy, thoughtful API is probably the part of your software where quality matters the most. Your colleagues might forgive you a little sloppiness in the internals of this or that method. But they won't (and shouldn't) forgive you for creating a bad API.&lt;/p&gt;




&lt;h2&gt;
  
  
  Design Patterns
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkfqmwj1itm2yogfmfxgg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fkfqmwj1itm2yogfmfxgg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sometimes, a solution is so beautiful, you wish you had the right problem to apply it to. But unfortunately, problems come first. As beautiful as your new screwdriver may be (imagine a handle made of gold, with your initials engraved, of course...), if the problem at hand is to knock in a nail, it makes for only a less than perfect solution.&lt;/p&gt;

&lt;p&gt;Now, after teaching you all I know about manual craft, let's return to software development - and consider "design patterns" as your toolbox. Every design pattern you know (and understand) is an instrument in your toolbox. It's certainly great to have many of them!&lt;/p&gt;

&lt;p&gt;The problems start, however, as soon as you let the patterns dictate your coding. They should be there to support you, to propose a proven solution - for the right problem! Programming paradigms should be used where they fit and not be enforced. Your components should be designed with your application's requirements in mind - not with a beautiful design pattern.&lt;/p&gt;

&lt;p&gt;In cases where you've indeed found a helpful pattern for your current problem, there's only one more thing: be sure to really &lt;em&gt;understand&lt;/em&gt; the pattern and its consequences on your coding.&lt;/p&gt;




&lt;h2&gt;
  
  
  Embrace Best Practices
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fa1xdr6ymqe7xkehzjqkc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fa1xdr6ymqe7xkehzjqkc.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's hard to find a programming problem that hasn't been solved by someone else already. And still, developers around the world are reinventing the wheel countless times, every day. I think it's a mixture of different things that encourages people to do this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;"&lt;strong&gt;I hate having 400 third-party libraries in my project.&lt;/strong&gt;" - Absolutely understandable, no one would love this. The thing is: when I'm talking about "solved problems", such a proven solution doesn't necessarily have to take the form of ready-made &lt;em&gt;code&lt;/em&gt;. It could also be a mere concept, a design pattern, or simply a discussion with the guy next door that you know has solved something similar. Solutions can take many forms - so don't limit yourself to just "libraries" and other forms of "complete" solutions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"&lt;strong&gt;It's just a small probem. I'll have my own solution in no time.&lt;/strong&gt;" - Every developer with more than a single day of experience has learned a very valuable lesson: Problems are (almost always!) more complex than they first seem. Experienced developers will have learned another lesson: Even with growing experience, it's still somewhere between hard and impossible to see all of the potential complexities that a problem contains. Put simply: we are prone to underestimate problems, again and again.&lt;br&gt;
All of this means that we should thoroughly evaluate if the problem at hand &lt;em&gt;really has to be&lt;/em&gt; solved by you on your own.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;"&lt;strong&gt;I don't like the existing solutions. I can create something better.&lt;/strong&gt;" - This could very well be another form of underestimation. Especially if a solution has been around for a while and used in many projects, you should thorougly check if your evaluation of that solution being bad is really correct. Again, we often tend to underestimate the complexities that hide in even the simplest problems. There's also another dimension to this topic: if the solution we're talking about is a commonly agreed way to handle such a problem - either in your team or on your technical platform - then you should again think twice before you go your very own way. The very least you should do is discuss your objections with your teammates.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this means that "best practices" - in the form of proven concepts, conventions, patterns, and high-quality libraries - should always be your first point of reference. After carefully verifying that those best practices aren't suitable for your special case, you're free to go your own way.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fashion-Driven Development
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuv2ov9zapcfz0hxum7ex.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fuv2ov9zapcfz0hxum7ex.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just for a moment, please imagine we'd be stuck in the eighties: we'd be stuck with rotary phones, flared pants, and terrible haircuts. What an unsettling idea...&lt;br&gt;
But thankfully, the world has evolved: technical (and fashionable) advancements have made things possible that weren't possible before. New technology has enabled us to create new things.&lt;/p&gt;

&lt;p&gt;But what about "old" technology? What about the software frameworks and libraries that were created yesterday? Are they, as a natural consequence, yesterday's news?&lt;/p&gt;

&lt;p&gt;In many fields, especially on the web, it's easy to get this impression: the newer the framework, the better it must be. Everything that was created last week is automatically inferior and, by all means, should be abandoned. But by following every new trend, we chicken out of the hard work to improve the things we already have - and miss out on a lot of quality.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quality takes time.&lt;/strong&gt; A piece of software that is new hasn't reached its peak, yet. It cannot. It will inevitably contain bugs and other problems that one can only &lt;em&gt;hope&lt;/em&gt; to correct with time and lots of hard work. New technology, therefore, isn't always &lt;em&gt;better&lt;/em&gt; technology.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality needs collaboration.&lt;/strong&gt; If, over time, we also seek the advice and feedback of others, we can harness another chance to make better software. Note that "collaboration" in this sense can come in many forms: as feedback and direct contributions, but also simply in the form of &lt;em&gt;usage and trial&lt;/em&gt;, e.g. when a library is included in many real-world projects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality grows out of failure.&lt;/strong&gt; New things haven't been given the chance to fail, yet. Technology is no exception to this rule: you have to show me perfect code that was written on the first go. Software &lt;em&gt;must&lt;/em&gt; have failed and been improved before it can be regarded to be mature.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While diving into new technology is important, we need to keep an eye on the &lt;em&gt;criteria&lt;/em&gt; we use to evaluate it. &lt;em&gt;Novelty&lt;/em&gt; isn't the exciting criteria - but &lt;em&gt;usefulness&lt;/em&gt; is. &lt;strong&gt;New technology needs to provide actual &lt;em&gt;value&lt;/em&gt; over existing solutions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We don't have to throw older, proven technologies out of the window the same moment we discover something new. Make sure you understand both the old technology and the new one before buying into the next new thing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Stack-Overflow-Driven Development
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcqaza2nvhs7ebugqr8dt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fcqaza2nvhs7ebugqr8dt.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank God for StackOverflow.com. I seriously can't imagine my (programming) life without it. And with it being one of the most visited sites on the web, I guess I'm not alone.&lt;/p&gt;

&lt;p&gt;There's a long friendship between me and Stack Overflow. It helped me countless times when I was stuck on a problem. It gave me an idea of how other people had approached the same problem. Sometimes these other people helped me solve my problem. Sometimes they gave me a hint for a possible solution. And sometimes reading their problems &lt;em&gt;at least&lt;/em&gt; let me know that I wasn't alone with a miserable bug...&lt;/p&gt;

&lt;p&gt;After hours or even days of searching and trying different things, your shields are down. You are crawling through your code on all fours like a man who's lost in the desert. But all of a sudden your search is successful! Eureka! Searching Stack Overflow has finally yielded a piece of code that &lt;em&gt;works&lt;/em&gt;!&lt;/p&gt;

&lt;p&gt;That's when you have to watch out and resist the temptation to take code that &lt;em&gt;works&lt;/em&gt; for code that's &lt;em&gt;good&lt;/em&gt;. What you've found on Stack Overflow is - in all but the rarest cases - not a &lt;em&gt;solution&lt;/em&gt; but rather a &lt;em&gt;clue&lt;/em&gt;. It can certainly make for a great pointer, but it was &lt;em&gt;not&lt;/em&gt; written with your exact problem / requirements / constraints /code base / application in mind. And sometimes, it might simply be a dirty hack.&lt;/p&gt;

&lt;p&gt;Embrace Stack Overflow as a good source of guidance for certain problems. But also take the time to thoroughly and honestly evaluate if you've found a real, solid solution.&lt;/p&gt;




&lt;h2&gt;
  
  
  Next Up: Collaboration &amp;amp; Testing
&lt;/h2&gt;

&lt;p&gt;In the second part of this series, we'll talk about collaboration and testing. Be sure to &lt;a href="https://www.git-tower.com/newsletter?utm_source=devto&amp;amp;utm_medium=guestpost&amp;amp;utm_campaign=dev-philosophy-1" rel="noopener noreferrer"&gt;join our newsletter&lt;/a&gt; to make sure you don't miss it!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>todayilearned</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
