<?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: Tamas Rev</title>
    <description>The latest articles on DEV Community by Tamas Rev (@tamasrev).</description>
    <link>https://dev.to/tamasrev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F17730%2F938565d0-0eac-4c40-9d19-b99bc04c3eb0.jpg</url>
      <title>DEV Community: Tamas Rev</title>
      <link>https://dev.to/tamasrev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tamasrev"/>
    <language>en</language>
    <item>
      <title>How to execute SQL?</title>
      <dc:creator>Tamas Rev</dc:creator>
      <pubDate>Fri, 15 Dec 2017 10:36:45 +0000</pubDate>
      <link>https://dev.to/tamasrev/how-to-execute-sql-3b2</link>
      <guid>https://dev.to/tamasrev/how-to-execute-sql-3b2</guid>
      <description>&lt;p&gt;People claim that it’s dangerous to generate and run SQL in the production. We should execute SQL in production carefully.&lt;/p&gt;

&lt;p&gt;Wait! Why is it important to run SQL carefully? More importantly, how to run SQL carefully? It’s not about typing &lt;code&gt;SELECT&lt;/code&gt; slowly, is it?&lt;/p&gt;

&lt;h3&gt;
  
  
  Why should we do it carefully?
&lt;/h3&gt;

&lt;p&gt;If we do any change in production system, we should do it carefully. Whether we deploy new code, upgrade the operating system or run any SQL, we should not mess up the system that’s already up and running. Users don’t like downtime. If users can’t access our page that hurts business. So that’s why.&lt;/p&gt;

&lt;h3&gt;
  
  
  How can we make production changes carefully?
&lt;/h3&gt;

&lt;p&gt;This carefulness falls into the following three categories:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;We should make sure that nothing goes wrong during the change.&lt;/li&gt;
&lt;li&gt;We should make sure that when something goes wrong, it has a minimal impact.&lt;/li&gt;
&lt;li&gt;When something goes wrong, we should have a plan how to fix it&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Making sure nothing goes wrong
&lt;/h3&gt;

&lt;p&gt;So, we should test our change before deploying it. In case of SQL we should have an identical database structure that we can play with. It’s even better to have a dataset realistically similar to that of the production database. Then we can run our stuff on that.&lt;/p&gt;

&lt;p&gt;These kind of databases usually need a separate environment. Usually the companies are trying to spare those resources. So we might have a handful of multi-purpose databases. We better don’t mess them up, not even during testing. How can we do this? You can see my tricks in the following sections.&lt;/p&gt;

&lt;h4&gt;
  
  
  Trick 1: Testing the &lt;code&gt;WHERE&lt;/code&gt; clause
&lt;/h4&gt;

&lt;p&gt;Before running a &lt;code&gt;DELETE&lt;/code&gt; or an &lt;code&gt;UPDATE&lt;/code&gt;, we should run a &lt;code&gt;SELECT&lt;/code&gt; with the same WHERE clause. So we know we’re targeting the desired dataset.&lt;/p&gt;

&lt;h4&gt;
  
  
  Trick 2: Using a transaction
&lt;/h4&gt;

&lt;p&gt;We can run our stuff in a transaction. In Oracle SQL Developer we can simply turn off auto commit. So if we’re happy with our results, then we can push the commit button. If we aren’t then we push the rollback button.&lt;/p&gt;

&lt;p&gt;Microsofts SQL Server Manager Studio doesn’t provide this functionality. But we can simulate it like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;BEGIN&lt;/span&gt; &lt;span class="n"&gt;TRANSACTION&lt;/span&gt;

&lt;span class="c1"&gt;-- do stuff&lt;/span&gt;

&lt;span class="c1"&gt;-- run SELECT-s to make sure we like the result&lt;/span&gt;

&lt;span class="k"&gt;ROLLBACK&lt;/span&gt; &lt;span class="n"&gt;TRANSACTION&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once we have the desired result, we can run it with a &lt;code&gt;COMMIT&lt;/code&gt; instead of a &lt;code&gt;ROLLBACK&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Trick 3: Having a backup of the test database
&lt;/h4&gt;

&lt;p&gt;It’s good to have a backup of the test database. This can be a snapshot of a virtual machine, or a snapshot of the database files. So if everything else fails, you can always go back to the previous state.&lt;/p&gt;

&lt;h3&gt;
  
  
  Making sure the impact is minimal
&lt;/h3&gt;

&lt;p&gt;There are several strategies to do risky stuff with minimal impact.&lt;/p&gt;

&lt;p&gt;We can implement small changes. So the result should be small. Usually it means &lt;a href="https://en.wikipedia.org/wiki/Continuous_integration"&gt;Continuous Integration&lt;/a&gt;, or maybe &lt;a href="https://en.wikipedia.org/wiki/Continuous_delivery"&gt;Continuous Delivery&lt;/a&gt;. Lots of automatic tests make it difficult to do stupid things on production. I don’t have much experience with those. As far as I heard, it requires lots of concentrated effort from the management and the technical teams to have Continuous Delivery. They say the problem itself if hard and there is no easy way around it. If you want it, then the whole company must figure out a way to do that in their business.&lt;/p&gt;

&lt;p&gt;The Bank Card business are regulated by the &lt;a href="https://www.pcisecuritystandards.org/pci_security/"&gt;PCI security standard&lt;/a&gt;. They must comply with a strict change management policy. So they roll out the changes in the off-hours. This is how they can have minimal impact.&lt;/p&gt;

&lt;h3&gt;
  
  
  Having a plan to fix it
&lt;/h3&gt;

&lt;p&gt;This plan is usually about rollbacks and backups. In case of code change there must be a way to roll it back. In case of a database change, there must be a way to roll it back.&lt;/p&gt;

&lt;p&gt;This means that before we go live with a change, we should test the rollback too.&lt;/p&gt;

&lt;p&gt;Backups are problematic because the online traffic doesn’t stop for those couple of hours while you’re restoring the backups. Usually we should avoid this.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wrapping up
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Try not to do ad-hoc changes on production databases.&lt;/li&gt;
&lt;li&gt;Test the &lt;code&gt;WHERE&lt;/code&gt; clause before changing the data.&lt;/li&gt;
&lt;li&gt;Test the SQL commands with transactions.&lt;/li&gt;
&lt;li&gt;Test the changes on test systems first.&lt;/li&gt;
&lt;li&gt;Test the rollback too.&lt;/li&gt;
&lt;li&gt;Have a back-up.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What are your tricks?&lt;/p&gt;




&lt;p&gt;Originally appeared at &lt;a href="https://tamasrev.wordpress.com/2017/12/11/how-to-execute-sql/"&gt;tamasrev&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>sql</category>
      <category>production</category>
      <category>backup</category>
    </item>
    <item>
      <title>How to debug in production</title>
      <dc:creator>Tamas Rev</dc:creator>
      <pubDate>Mon, 04 Dec 2017 17:03:53 +0000</pubDate>
      <link>https://dev.to/tamasrev/how-to-debug-in-production-4f8</link>
      <guid>https://dev.to/tamasrev/how-to-debug-in-production-4f8</guid>
      <description>&lt;p&gt;We’ve all seen bugs in production. Sometimes we can reproduce them, sometimes we can’t.&lt;/p&gt;

&lt;p&gt;When we can reproduce them, then we fix it quickly. The we do some regression tests to see if we broke anything else. And then we’re done.&lt;/p&gt;

&lt;p&gt;When we can’t reproduce it, that’s a totally different story.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do we know that we can’t reproduce it?
&lt;/h3&gt;

&lt;p&gt;This sounds simple, doesn’t it? We tried to use the system, and the problem hasn’t occurred. It is possible that we just couldn’t reproduce it yet? Is it possible that we’re only one step away from reproducing it?&lt;/p&gt;

&lt;p&gt;Let’s move from philosophical questions to pragmatic ones. Is it a waste of time tying to reproduce a NullPointerException? Is it a bigger waste of time blindly adding some code? How do we know it?&lt;/p&gt;

&lt;p&gt;Usually we have a process about reproducing. This process is usually implicit, nobody writes it down. My process looks something like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read the bug report&lt;/li&gt;
&lt;li&gt;Quickly check the exception trace, hoping that it reveals an obvious problem&lt;/li&gt;
&lt;li&gt;Try to reproduce it based on what’s written on the bug report&lt;/li&gt;
&lt;li&gt;Analyze the logs and the related source code to figure out what could’ve happened&lt;/li&gt;
&lt;li&gt;Try to reproduce it again&lt;/li&gt;
&lt;li&gt;In case of multi-threaded programming, tweak the threads and locks to reproduce an odd situation&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At every step I might go back to read the bug report and the logs. After a day or two I can either reproduce the bug, or I give up the search.&lt;/p&gt;

&lt;p&gt;When I give it up, then I do either or both of the two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reproduce and fix the issue with a unit-test.&lt;/li&gt;
&lt;li&gt;Add more logging.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If we reproduce a problem with a unit test, then we’re likely to fix only a symptom. Say for instance, if we add another null-check, then we still won’t know why a certain method receives invalid data. Soon we’ll see other &lt;code&gt;NullPointerException&lt;/code&gt;-s.&lt;/p&gt;

&lt;p&gt;When we add logging, then we’ll use lots of resources like CPU, Disk, Memory. Operators won’t allow it most of the time. They usually agree that it’s crucial to fix the bug. Yes, they want to help you figure out the root cause. No, sorry, they can’t let you add logging.&lt;/p&gt;

&lt;p&gt;Luckily, there are a few approaches to get debug data from production effectively.&lt;/p&gt;

&lt;h3&gt;
  
  
  Logging fix 1: Sampling
&lt;/h3&gt;

&lt;p&gt;One approach is sampling. We don’t have to log every user session. We can select every 1000th user session and log all of their data. Alternatively, we can use a random generator to select every 1000th user session and log that.&lt;/p&gt;

&lt;p&gt;This is useful only if the bug occurs quite frequently. Just keep in mind, we need to sample user sessions, not log events. So we’ll get detailed information on what went wrong.&lt;/p&gt;

&lt;p&gt;You might make the log sampling configurable. So if production operators finds that our logging still uses too many resources during peek time, they might turn it off for a couple of hours.&lt;/p&gt;

&lt;p&gt;An alternative of log sampling is A/B testing. If our architecture allows, we might turn on debug logging on a fraction of our servers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Logging fix 2: Logging a session in memory
&lt;/h3&gt;

&lt;p&gt;Sometimes we can log debug data in memory. If an error occurs in that user session, then we can write it to a file. If not, then we simply release the memory we’ve allocated.&lt;/p&gt;

&lt;p&gt;This is useful if the error occurs infrequently. In this case we have to do something to catch the bug as soon as it happens. However, production operation won’t necessarily be happy about it. It depends on the memory needs of our debug logging.&lt;/p&gt;

&lt;p&gt;We can combine this kind of logging with log sampling. Say for instance, we log debug data for every 10th user session, and write it to file when an error occurs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Logging fix 3: In-memory ring buffer, by &lt;a href="https://www.linkedin.com/in/istv%C3%A1n-kov%C3%A1cs-5619031/"&gt;Kofa&lt;/a&gt;.
&lt;/h3&gt;

&lt;p&gt;István Kovács explained a third approach: an in-memory ring buffer. Every log goes into this in-memory ring buffer. This buffer has a configurable size. Also, it’s a ring buffer, so the most recent logs overwrite the oldest lines.&lt;/p&gt;

&lt;p&gt;The logs that usually go to a file, they still go to a file. When an error occurs, the whole ring buffer gets written to a file.&lt;/p&gt;

&lt;p&gt;This is really cool because the memory overhead is limited. If you set the size of the ring buffer right, then you’ll have all the debug data you need. On the other hand, you might spend some time to find the right size for this ring buffer.&lt;/p&gt;

&lt;p&gt;What’s your approach?&lt;/p&gt;




&lt;p&gt;Originally appeared at &lt;a href="https://tamasrev.wordpress.com"&gt;tamasrev&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>logging</category>
      <category>debugging</category>
    </item>
    <item>
      <title>What can we learn from arrogant bosses?</title>
      <dc:creator>Tamas Rev</dc:creator>
      <pubDate>Tue, 28 Nov 2017 21:09:56 +0000</pubDate>
      <link>https://dev.to/tamasrev/what-can-we-learn-from-arrogant-bosses-5m0</link>
      <guid>https://dev.to/tamasrev/what-can-we-learn-from-arrogant-bosses-5m0</guid>
      <description>

&lt;p&gt;I believe, everybody encountered an arrogant boss through her career. An arrogant boss is somebody who… Well, someone who looks like an arrogant boss to me, he might be fine for you.&lt;/p&gt;

&lt;p&gt;Nobody is perfect, not even the managers. There are some kind of personality flaws that I can hardly tolerate while it might be fine for others. Also, there are personality flaws that I tolerate well, while others can’t handle it that well.&lt;/p&gt;

&lt;p&gt;The fun fact is that we can even learn from this kind of bad experiences.&lt;/p&gt;

&lt;h3&gt;
  
  
  So, how do you know you’re working for an arrogant boss?
&lt;/h3&gt;

&lt;p&gt;Arrogant people in general don’t respect your personal boundaries. They judge you. They criticize you. They make you work overtime a lot. They use language that you don’t like. And so on.&lt;/p&gt;

&lt;p&gt;So, your boss does something that you can hardly tolerate. He is pushing your buttons a little too much. He makes your life miserable. Too bad that you didn’t foresee it during the interview process. What now?&lt;/p&gt;

&lt;h3&gt;
  
  
  How to deal with it?
&lt;/h3&gt;

&lt;p&gt;You can try to tolerate it. I’m serious. Tolerance and self-composure are like a muscle. The more you train them, the stronger they become. You can practice how to calm yourself down in stressful situation. It’s going to be useful through your life.&lt;/p&gt;

&lt;p&gt;You can look at your boss and try to guess what he needs from you – give it to him if you can. You can learn how to read other peoples body language.&lt;/p&gt;

&lt;h3&gt;
  
  
  What are the advantages?
&lt;/h3&gt;

&lt;p&gt;In the previous paragraphs you already saw what you can learn in this kind of situation. I.e. you might become stronger and more resilient. But that’s not all!&lt;/p&gt;

&lt;p&gt;You might learn how this craziness is possible within the organization. So you can level up your systemic thinking skills.&lt;/p&gt;

&lt;p&gt;If you can get hardly anything right, then you get to decide what’s important for you. An arrogant boss is a great opportunity to get more conscious about your values. Some people want to do a good job. Some want to do god for the organization they are working for. Others need stimulating tasks. Some folks are people pleasers, and so on. So, if your boss fails to give clear priorities, then, ironically, you get to decide what’s important.&lt;/p&gt;

&lt;p&gt;If you work on monotonous tasks, then you’ll learn how to tolerate monotony. Also, you’ll learn how to deal with that kind of tasks. Say for instance, lots of maintenance work is going to improve your problem-solving skills. Believe or not, there is a &lt;a href="https://pragprog.com/book/pbdp/debug-it"&gt;book&lt;/a&gt; about debugging &lt;a href="https://tamasrev.wordpress.com/2014/04/06/applied-science-debugging/"&gt;effectively&lt;/a&gt;. It’s a really good one.&lt;/p&gt;

&lt;p&gt;Do you have to work on a code base you can’t stand looking at? Come on, there’s a &lt;a href="https://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052"&gt;book&lt;/a&gt; about that too. Distasteful it might be, a legacy code base is a good place to enhance your analytical skills. Moreover, you’ll learn how to pin down the problem to a couple of classes. You’ll learn what to focus on. It’s an incredibly important skill.&lt;/p&gt;

&lt;h3&gt;
  
  
  When to stop?
&lt;/h3&gt;

&lt;p&gt;Tolerance and self-composure are like a muscle. You can chronically exhaust them.&lt;/p&gt;

&lt;p&gt;Look for signs of burnout and depression. If you’re frequently moody, tired or irritated then it’s probably getting too much.&lt;/p&gt;

&lt;p&gt;Again, it’s about knowing your priorities. You need to know how much convenience you want to sacrifice for the sake of learning. However, when it’s getting under your skin then it’s time to move on. You should not trade your mental health for a job.&lt;/p&gt;

&lt;p&gt;Anyway, these skills you’ve just learned at your job, they are going to pay off well – in your next position. Don’t stick to a bad job for too long.&lt;/p&gt;




&lt;p&gt;Originally appeared at &lt;a href="https://tamasrev.wordpress.com/2017/10/02/what-can-we-learn-from-arrogant-bosses/"&gt;tamasrev&lt;/a&gt;.&lt;/p&gt;


</description>
      <category>softskills</category>
      <category>work</category>
    </item>
    <item>
      <title>Why not write clean code?</title>
      <dc:creator>Tamas Rev</dc:creator>
      <pubDate>Fri, 13 Oct 2017 15:06:19 +0000</pubDate>
      <link>https://dev.to/tamasrev/why-not-write-clean-code-7i7</link>
      <guid>https://dev.to/tamasrev/why-not-write-clean-code-7i7</guid>
      <description>

&lt;p&gt;I think you already know what clean code is: this is the famous Uncle Bob &lt;a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882"&gt;book&lt;/a&gt;, which provides a very accurate definition of readable code. Ever since that book was published there have been a lot of talking about Clean Code. People talk about craftsmanship, readability. They even go to code retreats. Should you say something publicly against clean code you’ll find yourself on a &lt;a href="http://www.techdarkside.com/when-is-ugly-code-okay"&gt;"never to be hired"&lt;/a&gt; list. Talking about &lt;a href="http://www.joelonsoftware.com/items/2009/09/23.html"&gt;Duct-Tape Programmers&lt;/a&gt; is not cool anymore. Even &lt;a href="http://www.youtube.com/watch?v=QlqA0OKsBB8"&gt;&lt;del&gt;Dave&lt;/del&gt;&lt;/a&gt; Paul Graham agrees that we have to write &lt;a href="http://www.paulgraham.com/head.html"&gt;re-readable code&lt;/a&gt;. OK, maybe Paul said that years before Uncle Bob published this book, but you get the point.&lt;/p&gt;

&lt;p&gt;Sadly, nobody asks why not write clean code? I have many independent reasons for that:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Any fool can point out mistakes in clean code.
&lt;/h3&gt;

&lt;p&gt;Suppose you spent some time and effort on making your code clean. You removed duplications, you used short and consistent names, your methods are easy to understand. At a certain point you decided that this much polishing is enough – shipment is a feature anyway.&lt;/p&gt;

&lt;p&gt;Some time later a colleague will look at your code and point out actual problems. The more names you use the more you can misspell. The shorter methods you use the more easy it is to find duplication. So your coworker walks over and tells you how to improve it. Shame, isn’t it?&lt;/p&gt;

&lt;p&gt;None of this could have happened if you wrote messy code. In that case the best your coworker could say is “it’s dirty”. There is a good reply for that: “So what? It works! The louder you say that the more convincing it is. Nobody would find bugs in your code just by looking at it.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. You like to be important
&lt;/h3&gt;

&lt;p&gt;Suppose you go to a vacation for 2-3 weeks. When you come back your colleagues tell you that a user reported a bug in your code – and they fixed it. They’ll tell you that they factored out a few things without introducing new bugs , thanks to your thorough unit tests. After that refactor, they would say, they could easily fix the original bug and release the new version.&lt;/p&gt;

&lt;p&gt;Something doesn’t feel right, does it? It sounds like you are replaceable – and now everybody knows it. It should never happen. Wouldn’t it be better if they called you in the middle of your vacation to fix that thing ASAP? It’s a little inconvenient at first, but who cares? Your family will know that you are a super-important world-class hacker. Your coworkers will know too that if you leave, they can rewrite your module from scratch.&lt;/p&gt;

&lt;p&gt;So what to do when they call you with an urgent problem? You have many options:&lt;/p&gt;

&lt;p&gt;You can kindly explain that it’s a very easy problem and you can tell them how to fix it. If that method didn’t work out well you can still blame them for misinterpreting what you said&lt;br&gt;
Quite often you’ll get your hands dirty and fix the problem yourself&lt;br&gt;
Sometimes you can be a little harsh, e.g. “Can you guys get done anything without me?”&lt;br&gt;
Bottom line: everybody will treat you with utter respect.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. You don’t like OO principles
&lt;/h3&gt;

&lt;p&gt;There are these acronyms like DRY or DIP. If you google them you’ll find long explanations about, basically, nothing. All they are saying that for some abstract reasons like flexibility or modularity you’ll have to write more complex code. Once you start paying attention to these principles your code will be full of Design Patterns.&lt;/p&gt;

&lt;p&gt;Come on! Do you let these principles diminish your effort to patternless code? You know you can do better! You can say that all those patterns add unnecessary complexity to your code. Should anyone question why you have 7 almost identical variations of a code block across 3 methods you can always tell them: “this way you can easily see the flow: one step after another”. The more often you say this the more convincing it is.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. You want to create jobs for others
&lt;/h3&gt;

&lt;p&gt;I know you are a true altruist deep down inside. Once you write that service you don’t want the company founders to take all the money. You want them to hire more testers and software engineers to understand and maintain the thing you created. What can be more noble than creating jobs and puzzles for other people?&lt;/p&gt;

&lt;h2&gt;
  
  
  Are there any real reasons for not writing clean code?
&lt;/h2&gt;

&lt;p&gt;OK, let’s put the jokes aside. Are there any reasons for not writing clean code? Well, one could ask if are there any reasons for writing bad code. That’s a big no-no. However, the cleanliness of code is rather a 0-1 scale than a 0/1 boolean. I believe there are a few cases when you don’t need to write extra-clean code:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. You don’t know how to write clean code
&lt;/h3&gt;

&lt;p&gt;Indeed this is a real one. Say you want to learn how to write clean code. You are really enthusiastic, however, you tend to take everything literally. (I am also guilty of this.) Well, then, you shouldn’t write clean code right away. If you try to apply all the techniques in that book then you’ll end up with the worst code you ever wrote. I suggest to learn and practice them one by one. Once you can apply a technique almost automatically then you can go on to the next. Sooner than you think you’ll write amazing code.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. You are in crunch mode
&lt;/h3&gt;

&lt;p&gt;This is real too. Sometimes you are in crunch mode. Maybe there is a bug in your service and your company is loosing hundred thousand dollars each day until it’s fixed.&lt;/p&gt;

&lt;p&gt;I’m hesitating to mention the case when you work for a startup, having to release something before your competition does. I’m hesitating because you can save most of the time on choosing RAD tools. You can save some time (and gain a lot of bugs) for not using TDD (more on this here). Although it is clear that startups cannot spend time on extra-clean code, writing bad code won’t help either.&lt;/p&gt;

&lt;p&gt;For whatever reason you are in crunch mode: Go ahead, fix and ship for the greater good. Just don’t forget to clean up the mess later.&lt;/p&gt;




&lt;p&gt;Originally appeared at &lt;a href="https://tamasrev.wordpress.com/2013/02/02/why-not-write-clean-code/"&gt;tamasrev&lt;/a&gt; blog.&lt;/p&gt;


</description>
      <category>programming</category>
      <category>cleancode</category>
      <category>irony</category>
    </item>
  </channel>
</rss>
