メリーズ おむつ テープ M 6kg-11kg 64枚*4個セット KENPO_09 d2rec KENPO_12 メリーズ オムツ 紙おむつ 赤ちゃん まとめ買い 通気性
アサヒペン インテリアカラー 浴室カベ用 クリーム色 1.6L*3個セット アサヒペン 2020,大得価
NEWCASTLE CLASSICS バンブースワドル Dandelions 4枚セット ニューキャッスルクラシックス 新品,品質保証
アウトレット ラスト1点 フィリップモデル PHILIPPE MODEL PARIS スニーカー ブラック メンズ シューズ 靴 カジュアル 大きいサイズあり vblu v027 MADELEINE VEAU 返品送料無料 ラッピング無料 190723 新
ガーデル GARDEL ネックレス シルバー メンズ ギフト プレゼント gdp086 sv cz ALLUMAGE NECKLACE 返品交換不可 ラッピング無料 定番,格安
西川リビング 2441-11027 快圧タイプ2ふとんKA03 3つ折り S ベージュ 送料無料 新作入荷,豊富な
明治ほほえみ 800g meijiSU03 KENPO_09 イチオシ KENPO_12 明治ほほえみ 粉ミルク
シャープ 壁掛扇 ホワイト系 PJ-J3AK-W 1台 シャープ 扇風機 本物保証,新品
セトクラフト ソーラーオーナメント 3匹のこぶた わらの家SR-0696 1コ入 品質保証,お得
型くずれ防止平干しネット 100個セット 驚きの破格値
エポック 敷き布団カバー ダブルロングサイズ 代引不可 送料無料 100%新品,SALE
綿100% 水彩風 ダマスク柄 敷き布団カバー シングルロングサイズ 105×215cm 寝具カバー 布団カバー 送料無料 smtb-f 安い,2020
布団 丸洗い布団セット シングル アルファイン布団用セット 送料無料 お買い得,100%新品
アツギ ザ レッグバー デオドラントストッキングAS着圧 コーラルベージュ M-L 1足入*5袋セット アツギ ATSUGI 100%新品,爆買い
ビベッタラグランスリーブ付きウルトラビブフィッシュ 1個入 ビベッタ 新作,大人気
ジル サンダー JIL SANDER ドローストリングバッグ ブラック メンズ jsmq850138 mqb72023x 001 返品送料無料 ラッピング無料 限定セール,本物保証
クロミ 布団カバー3点セット シングル Sanriozone Sanrio サンリオ 和式 洋式 布団カバー 掛布団カバー 敷布団カバー 枕カバー 代引不可 送料無料 定番,人気
掛け布団 オーガニックコットン 肌掛け布団 掛布団 掛ふとん シングル 洗える グレー ウォッシャブル コットン キルトケット 送料無料 新作登場,大得価
エトロ ETRO シルク リネン混 ストール マフラー メンズ アクセサリ シルク リネン ギフト プレゼント 10007 5110 750 red ラッピング無料 返品送料無料 低価,限定SALE
ワトコオイル W-12 ミディアムウォルナット 1L 高品質,定番人気

ボタニー プレート 25型 ベージュ 30個セット 新作,お買い得
布団 丸洗い カバー クイーン アルファイン敷カバー 送料無料 2020,お買い得
高密度防ダニ生地使用 3層硬わたしっかり敷布団 D RUNA010D 送料無料 人気,限定セール
低反発フォームパッド4cm厚 エアーニット シングル WH オフホワイト 代引き不可 送料無料 人気SALE,得価
医師との共同開発 い草枕 アスク 低い 低反発枕 箱付 約50×30×7〜9cm 中材:低反発ウレタンチップ 代引不可 送料無料 超激得,新作
老舗洋食 すずらん 1BOX
セントアーク ハンドウォッシュスピナー HWS4001 1台 新作入荷,新作入荷,HOT
エレコム ACアダプター ノートPC スマートフォン PD 45W USB Type-C ACDC-PD0545WH 1個 高品質,定番
ならげた ゾリム ウェーブウッド 舞桜 レディースM 1足 ならげた 全国無料,人気
サラノニ バンボーニブランケット レシービング ひざ掛けサイズ ノーティカルブルー 1枚入 サラノニ Saranoni 赤字超特価
NEWCASTLE CLASSICS コットンスワドル Forest Friends 4枚入 ニューキャッスルクラシックス
光洋化学 エースクロスSBW 両面テープ 黒 50mm*20m 20巻入 光洋化学 格安,HOT
ハロー ボックスティシュ PEFC100% 280組*3個入*12セット ハロー 低価
ウルトラ怪獣DX ガーゴルゴン 1セット 格安,得価
アサヒペン 油性トタン用 オーシャンブルー 0.7L アサヒペン お買い得,HOT
BIG ヨードで洗濯槽クリーン ゴミ取り 1コ入 爆買い,限定SALE
シンコー エコアート塗るだけ EAN 711 フローラルホワイト 5kg シンコー HOT,爆買い
FESTA HOME ボアブランケット レッド 140×100cm SFFQ1801RD 代引不可 送料無料 お買い得,人気
訳あり アウトレット Bランク オロビアンコ Orobianco ブリーフケース 2WAY ブラック メンズ バッグ ビジネスバッグ トートバッグ ナイロン レザー A4対応 ブランド ワケアリ rufus RUFUS ルーファス 返品交換不可 新作,HO
キュービックボディ セミダブル PT-200 3つ折り マットレス 高反発 ボディープレミアム ゼンケン 代引不可 送料無料 限定SALE,安い
もふもふたちのユートピア モフトピア 冷感抱き枕 抱きまくら 抱き枕 まくら ぬいぐるみ モフトピア もふとぴあ Mofutopia smtb-f 人気SALE,限定SALE
ベアフットドリームス BAREFOOT DREAMS ブランケット ブラウン 茶色 インテリア プレゼント 新築祝い 結婚祝い b510 21 tw espresso twin blanket 170720 数量限定,正規品
アイリスオーヤマ カラーボックスシーツ 布団カバー ブラウンCMB-D 代引き不可 送料無料 新作,爆買い
布団カバー 無地 洗える オーガニックコットン使用 マドラス 枕カバー アイボリー 43×63cm 代引不可 送料無料 100%新品,爆買い
LPL LEDライトビューティーフェイス VLR-F300XP L27855 1個 HOT,お買い得
ボッテガヴェネタ BOTTEGA VENETA セカンドバッグ コンチネンタルウォレット メンズ 財布 バッグ トラベル 旅行 パスポートケース ギフト 302652 vq122 4234 LEGGERRO 返品送料無料 ラッピング無料 人気,格安
カビキラー アクティブ酸素で落とす洗たく槽カビキラー 250g*6袋セット カビキラー 限定セール,100%新品
シグマ 40mm F1.4 DG HSM Art ニコン 1本 安い,お買い得
海外用 マルチ変換プラグ USB付 2A 白 HPM42AWH 1コ入 格安,最新作
ネイルケア ホワイト 家電 健康 美容家電 美容器具 人気セール,新品
マルミ EXUS ND8 減光フィルター 光量調節用 49mm 1コ入 激安大特価,本物保証
ランバン LANVIN ボウタイ 蝶ネクタイ RED レッド系 260 78018 lvn tie 002 メンズ ラッピング無料 返品送料無料 得価,限定SALE
エリエール 贅沢保湿 ポケット 28枚 14組*20コ入 *12コセット エリエール ティッシュ 最新作,高品質
おそとでメディキュット 防寒 あったかつま先裏パイル着圧タイツ ブラック M 1足分*3箱セット メディキュット QttO 100%新品,新作
アースガーデン 除草剤 アースカマイラズ 草消滅 ジョウロヘッド 2L b00c アースガーデン
Ferrari 公式ライセンス品 アップル認証Lightning MicroUSB端子付き車載充電器 1コ入 新作登場,本物保証
羽毛布団 セミダブル スペイン産ホワイトダック 成熟羽毛寝具シリーズ 真羽毛 掛け布団 セミダブル ロングサイズ 日本製 代引不可 送料無料 赤字超特価,100%新品
緑の魔女 トイレ用 詰替 360ml*24袋セット 緑の魔女 限定SALE,新品
ボールド ジェルボール3D 癒しのプレミアムブロッサムの香り 詰替用 ウルトラジャンボ 63個入*4袋セット ボールド 得価,定番
アウトレット ボスヒューゴボス BOSS HUGOBOSS ネクタイ 剣先幅:7.5cm タイ ピンク メンズ アクセサリ 身だしなみ ギフト プレゼント tie 50407393 406 BOSS BLACK TIE 返品送料無料 ラッピング無料 190
コンビ monpoke TT授乳のお手本 P160 1セット お買い得,100%新品
PIERIA 大風量セラミックヒーター マイコン式 ホワイト 1台 ピエリア Pieria 本物保証,安い
Pix キッチン用泡スプレー つけかえ用 400g*20個セット ピクス PIX 人気SALE,限定SALE
バーバリー BURBERRY ボストンバッグ 2WAY ベージュ メンズ バッグ トラベル 旅行 ダッフル 4074216 canvasblue MD KENNEDY ケネディー ラッピング無料 返品送料無料 180830 豊富な,お得
アウトレット ボスヒューゴボス BOSS HUGOBOSS トートバッグ 2WAY ブラック メンズ プレゼント コラボ カプセルコレクション meiss 50421252 001 BOSS×MEISSEN 返品送料無料 ラッピング無料 最新作,新作
ランドリークラブ 作業服専用液体洗剤 詰替 500g*20袋セット ランドリークラブ 大得価,お得
ペットプロ ボーダーコットンベッド BIG トリコロール 新作入荷,新作入荷,HOT
マカロンヒップ骨盤ショーツガードル LLサイズ パープル 1枚入 定番人気,爆買い
重曹電解クリーナー 業務用 300枚入
新素材のピロー登場 メディカルライフピロー type-7 ジェルパウダー エコテックス規格 代引不可 送料無料 新作登場,定番
犬用歯磨き粉 ペット ペットケア デンタルケア 95g 代引不可 送料無料 お得,格安
ソフトフィットインソール 低反発 子供用 フリーサイズ 18.0-22.0cm 240セット 人気SALE,限定セール
枕 まくら 籐枕 籐まくら ピロー 通気性抜群 蒸れない 籐枕 約30×17cm 代引不可 送料無料 smtb-f 限定セール,安い
ステリア 角ハンガー 40ピンチ 88200 1コ入 ステリア 新品,高品質
仏膳6寸 黒 内朱 1コ入 限定SALE,最新作
充電式 スタンドデスクファン ホワイト 1台 スリーアップ 新品,本物保証
セトクラフト ティッシュケース カート ブラック SF-3869-BK-220 1個 爆買い,本物保証
メカ式冷風扇 MAR-120 1台 豊富な,新作登場
枕 まくら い草枕 消臭 ピロー 国産 無地 高さ調整 スリム 角枕 グリーン 約30×15cm 代引不可 送料無料 smtb-f 全国無料,大人気
ビクセン 双眼鏡 アトレックII HR 10*32WP 14724-3 1台 お買い得,人気SALE
プラレール 新幹線変形ロボ シンカリオン DXS104 シンカリオン ALFA-X 1セット プラレール HOT,人気

ドギーマンハヤシ Nekoリビング キャティ―ポール 送料無料 安い,100%新品
アサヒペン 屋外用サインシート 赤 PC104 1m*25m 1枚 アサヒペン
ポケットモンスター PCクッション ピカチュウ 1コ入
エフシステム デスク 幅60cm パソコンデスク PCデスク オフィスデスク ワークデスク 事務机 勉強机 学習机 パソコン台 代引不可 送料無料 smtb-f HOT,正規品
ボーラ― BALR. バックパック リュックサック レッド メンズ バック パック アウトドア ラグジュアリー u series backpack red BALR. RED BACKPACK 返品送料無料 ラッピング無料 新作入荷,人気
キッズ&ベビー, キッチン用品
キッチン用品, ダイエット・健康
チャリティー, デスク
香水が登場です, デスク
美容・コスメ・香水が登場です
ライト・照明器具
メンズバッグ, チャリティー
文具・卓上用品, 日用品
チャリティー, メンズファッション小物
レディースバッグ, 化粧美容用品
ホーム用品, メンズアクセサリー
ダイエット・健康, 美容・コスメ・香水
メンズバッグ, イト・照明器具
家電, 寝具, 文具・卓上用品
寝具, 掃除・洗濯, イト・照明器具
ダイエット・健康, 化粧美容用品

How to Build Good Software

Software has characteristics that make it hard to build with traditional management techniques; effective development requires a different, more exploratory and iterative approach.

 

Why Bad Software Happens to Good People

 

Bad software is one of the few things in the world you cannot solve with money. Billion dollar airlines have flight search apps that are often inferior to those built by groups of students. Established taxi companies the world over have terrible booking apps despite the threat they face from ride-sharing services. And painful corporate IT systems are usually projects with massive budgets, built over the course of many years. Whatever the cause of bad software is, it does not seem to be a lack of funding.

 

Surprisingly, the root cause of bad software has less to do with specific engineering choices, and more to do with how development projects are managed. The worst software projects often proceed in a very particular way:

 

The project owners start out wanting to build a specific solution and never explicitly identify the problem they are trying to solve. They then gather a long list of requirements from a large group of stakeholders. This list is then handed off to a correspondingly large external development team, who get to work building this highly customised piece of software from scratch. Once all the requirements are met, everyone celebrates as the system is launched and the project is declared complete.

 

The root cause of bad software has less to do with specific engineering choices, and more to do with how development projects are managed.

 

However, though the system technically meets specifications, severe issues are found when it is put in the hands of actual users. It is slow, confusing, and filled with subtle bugs that make using it an exercise in frustration. Unfortunately, by this time the external development team has been dismissed and there are no resources left over to make the necessary fixes. By the time a new project can be initiated years later, all knowledge of what caused these problems has left the organisation and the cycle starts over again.

 

The right coding language, system architecture, or interface design will vary wildly from project to project. But there are characteristics particular to software that consistently cause traditional management practices to fail, while allowing small startups to succeed with a shoestring budget:

 

• Reusing good software is easy; it is what allows you to build good things quickly;
• Software is limited not by the amount of resources put into building it, but by how complex it can get before it breaks down; and
• The main value in software is not the code produced, but the knowledge accumulated by the people who produced it.

 

Understanding these characteristics may not guarantee good outcomes, but it does help clarify why so many projects produce bad outcomes. Furthermore, these lead to some core operating principles that can dramatically improve the chances of success:

 

1. Start as simple as possible;
2. Seek out problems and iterate; and
3. Hire the best engineers you can.

 

While there are many subtler factors to consider, these principles form a foundation that lets you get started building good software.

 

Reusing Software Lets You Build Good Things Quickly

 

Software is easy to copy. At a mechanical level, lines of code can literally be copied and pasted onto another computer. More generally, the internet is full of tutorials on how to build different kinds of systems using ready-made code modules that are available online. Modern software is almost never developed from scratch. Even the most innovative applications are built using existing software that has been combined and modified to achieve a new result.

 

The biggest source of reusable code modules is the open source community. Open source software is software in which code is freely published for anyone to see and use. Many of the largest contributors to the open source community are giant tech companies. If you want to use a state-of-the-art planet scalable database as Facebook does, just download the code for Cassandra that they open sourced in 2008. If you want to try out Google’s cutting-edge machine learning for yourself, download the TensorFlow system published in 2015. Using open source code does not just make your application development faster, it gives you access to technology that is far more sophisticated than anything you could have developed yourself. For the most popular open source code, it is even more secure as there are many more people paying attention and fixing vulnerabilities. This is the reason digital technology has made such rapid progress: even the newest engineers can build upon the most advanced tools our profession has to offer.

 

The advent of cloud services has taken reusability even further, offering the full use of even proprietary systems for just a subscription fee. Need a simple website? Just configure one in a few clicks using a website building service like Squarespace or Wix. A database? Subscribe to a virtual one from Amazon Web Services or Microsoft Azure. Cloud services allow developers to benefit from specialisation; the service provider handles the setup, maintenance, and continued development of a reliable, high-quality piece of software that is used by all its subscribers. This allows software developers to stop wasting time on solved problems and instead focus on delivering actual value.

 

You cannot make technological progress if all your time is spent on rebuilding existing technology. Software engineering is about building automated systems, and one of the first things that gets automated away is routine software engineering work. The point is to understand what the right systems to reuse are, how to customise them to fit your unique requirements, and fixing novel problems discovered along the way.

 

Software engineering is about building automated systems, and one of the first things that gets automated away is routine software engineering work.

 

Software Is Limited by Complexity

 

How useful a piece of software can be is usually limited by its complexity rather than the amount of resources invested in building it.

 

IT systems are often full of features but are still hated by users because of how confusing they become. In contrast, highly ranked mobile apps tend to be lauded for their simplicity and intuitiveness. Learning to use software is hard. Beyond a point, new features actually make things worse for users because the accumulated complexity starts to become overwhelming. For example, after serving as the hub of Apple’s media ecosystem for almost 20 years, iTunes was split into three different apps (for music, podcasts, and TV shows) this year, as its features had grown too complex for one app to handle. From a usability perspective, the limit is not how many features can be implemented, but rather what can fit into a simple intuitive interface.

 

Even ignoring usability, engineering progress slows to a halt once a project becomes too complex. Each new line of code added to an application has a chance of interacting with every other line. The bigger an application’s codebase, the more bugs are introduced whenever a new feature is built. Eventually, the rate of work created from new bugs cancels out the rate of work done from feature development. This is known as “technical debt” and is the main challenge in professional software development. It is the reason why many large IT systems have issues that go unfixed for years. Adding more engineers to the project just adds to the chaos: they start running faster in place as the codebase keels over from its own weight.

 

Building good software involves alternating cycles of expanding and reducing complexity.

 

In such cases, the only way forward is to take a step back to rationalise and simplify the codebase. The system architecture can be redesigned to limit unexpected interactions. Non-critical features can be removed even if they have already been built. Automated tools can be deployed to check for bugs and badly written code. Bill Gates once said “Measuring programming progress by lines of code is like measuring aircraft building progress by weight”. Human minds can only handle a finite amount of complexity, so how sophisticated a software system can get depends on how efficiently this complexity budget is used.

 

Building good software involves alternating cycles of expanding and reducing complexity. As new features are developed, disorder naturally accumulates in the system. When this messiness starts to cause problems, progress is suspended to spend time cleaning up. This two-step process is necessary because there is no such thing as platonically good engineering: it depends on your needs and the practical problems you encounter. Even a simple user interface such as Google’s search bar contains a massive amount of complexity under the surface that cannot be perfected in a single iteration. The challenge is managing this cycle, letting it get messy enough to make meaningful progress, but not letting it get so complicated that it becomes overwhelming.

 

There is no such thing as platonically good engineering: it depends on your needs and the practical problems you encounter.

 

Software Is about Developing Knowledge More than Writing Code

 

In software development, most ideas are bad; this is not anyone’s fault. It is just that the number of possible ideas is so large that any particular idea is probably not going to work, even if it was chosen very carefully and intelligently. To make progress, you need to start with a bunch of bad ideas, discard the worst, and evolve the most promising ones. Apple, a paragon of visionary design, goes through dozens of prototypes before landing on a final product. The final product may be deceptively simple; it is the intricate knowledge of why this particular solution was chosen over its alternatives that allows it to be good.

 

This knowledge continues to be important even after the product is built. If a new team takes over the code for an unfamiliar piece of software, the software will soon start to degrade. Operating systems will update, business requirements will change, and security problems will be discovered that need to be fixed. Handling these subtle errors is often harder than building the software in the first place, since it requires intimate knowledge of the system’s architecture and design principles.

 

In the short term, an unfamiliar development team can address these problems with stopgap fixes. Over time though, new bugs accumulate due to the makeshift nature of the additional code. User interfaces become confusing due to mismatched design paradigms, and system complexity increases as a whole. Software should be treated not as a static product, but as a living manifestation of the development team’s collective understanding.

 

Software should be treated not as a static product, but as a living manifestation of the development team’s collective understanding.

 

This is why relying on external vendors for your core software development is difficult. You may get a running system and its code, but the invaluable knowledge of how it is built and what design choices were made leaves your organisation. This is also why handing a system over to new vendors for “maintenance” often causes problems. Even if the system is very well documented, some knowledge is lost every time a new team takes over. Over the years, the system becomes a patchwork of code from many different authors. It becomes harder and harder to keep running; eventually, there is no one left who truly understands how it works.

 

For your software to keep working well in the long term, it is important to have your staff learning alongside the external help to retain critical engineering knowledge in your organisation.

 

3 Principles for Good Software Development

 

1. Start as Simple as Possible

 

Projects that set out to be a “one-stop shop” for a particular domain are often doomed. The reasoning seems sensible enough: What better way to ensure your app solves people’s problems than by having it address as many as possible? After all, this works for physical stores such as supermarkets. The difference is that while it is relatively easy to add a new item for sale once a physical store is set up, an app with twice as many features is more than twice as hard to build and much harder to use.

 

Building good software requires focus: starting with the simplest solution that could solve the problem. A well-made but simplistic app never has problems adding necessary features. But a big IT system that does a lot of things poorly is usually impossible to simplify and fix. Even successful “do it all” apps like WeChat, Grab, and Facebook started out with very specific functionality and only expanded after they had secured their place. Software projects rarely fail because they are too small; they fail because they get too big.

 

Software projects rarely fail because they are too small; they fail because they get too big.

 

Unfortunately, keeping a project focused is very hard in practice: just gathering the requirements from all stakeholders already creates a huge list of features.

 

One way to manage this bloat is by using a priority list. Requirements are all still gathered, but each are tagged according to whether they are absolutely critical features, high-value additions, or nice-to-haves. This creates a much lower-tension planning process because features no longer need to be explicitly excluded. Stakeholders can then more sanely discuss which features are the most important, without worrying about something being left out of the project. This approach also makes explicit the trade-offs of having more features. Stakeholders who want to increase the priority for a feature have to also consider what features they are willing to deprioritise. Teams can start on the most critical objectives, working their way down the list as time and resources allow.

 

We followed a similar process for all our most successful apps. Form.gov.sg started out as a manual Outlook Macro that took us six hours to set up for our first user but today has processed about a million public submissions. Data.gov.sg started out as a direct copy of an open source project and has since grown to over 300,000 monthly visits. Parking.sg had a massive list of almost 200 possible features that we never got around to building but still has over 1.1 million users today. These systems are well received not in spite of their simplicity but because of it.

 

2. Seek Out Problems and Iterate

 

In truth, modern software is so complicated and changes so rapidly that no amount of planning will eliminate all shortcomings. Like writing a good paper, awkward early drafts are necessary to get a feel of what the final paper should be. To build good software, you need to first build bad software, then actively seek out problems to improve on your solution.

 

This starts with something as simple as talking to the actual people you are trying to help. The goal is to understand the root problem you want to solve and avoid jumping to a solution based just on preconceived biases. When we first started on Parking.sg, our hypothesis was that enforcement officers found it frustrating to have to keep doing the mental calculations regarding paper coupons. However, after spending just one afternoon with an experienced officer, we discovered that doing these calculations was actually quite simple for someone doing it professionally. That single conversation saved us months of potentially wasted effort and let us refocus our project on helping drivers instead.

 

Beware of bureaucratic goals masquerading as problem statements. “Drivers feel frustrated when dealing with parking coupons” is a problem. “We need to build an app for drivers as part of our Ministry Family Digitisation Plans” is not. “Users are annoyed at how hard it is to find information on government websites” is a problem. “As part of the Digital Government Blueprint, we need to rebuild our websites to conform to the new design service standards” is not. If our end goal is to make citizens’ lives better, we need to explicitly acknowledge the things that are making their lives worse.

 

Having a clear problem statement lets you experimentally test the viability of different solutions that are too hard to determine theoretically. Talking to a chatbot may not be any easier than navigating a website, and users may not want to install yet another app on their phones no matter how secure it makes the country. With software, apparently obvious solutions often have fatal flaws that do not show up until they are put to use. The aim is not yet to build the final product, but to first identify these problems as quickly and as cheaply as possible. Non-functional mock-ups to test interface designs. Semi-functional mock-ups to try different features. Prototype code, written hastily, could help garner feedback more quickly. Anything created at this stage should be treated as disposable. The desired output of this process is not the code written, but a clearer understanding of what the right thing to build is.

 

Beware of bureaucratic goals masquerading as problem statements. If our end goal is to make citizens’ lives better, we need to explicitly acknowledge the things that are making their lives worse.

 

With a good understanding of the right solution, you can start work on building the actual product. You stop exploring new ideas and narrow down to identifying problems with your particular implementation. Begin with a small number of testers who will quickly spot the obvious bugs that need to be fixed. As problems are addressed, you can increasingly open up to a larger pool who will find more esoteric issues.

 

Most people only give feedback once. If you start by launching to a large audience, everyone will give you the same obvious feedback and you’ll have nowhere to go from there. Even the best product ideas built by the best engineers will start out with significant issues. The aim is to repeatedly refine the output, sanding down rough edges until a good product emerges.

 

Even after all this iteration, after launch is when problems with a product matter the most. A problem that happens only 0.1% of the time may not get noticed during testing. But once you have a million users, every day the problem goes unresolved is a thousand more angry people you have to deal with. You need to fix problems caused by new mobile devices, network outages, or security attacks before they cause substantial harm to your users. With Parking.sg we built a series of secondary systems that continuously check the main system for any discrepancies in payments, duplicate parking sessions, and application crashes. Building up an “immune system” over time lets you avoid being overwhelmed as new issues inevitably come up.

 

Overall, the approach is to use these different feedback loops to efficiently identify problems. Small feedback loops allow for quick and easy correction but miss out on broader issues. Large feedback loops catch broader issues but are slow and expensive. You want to use both, resolving as much as possible with tight loops while still having wide loops to catch unexpected errors. Building software is not about avoiding failure; it is about strategically failing as fast as possible to get the information you need to build something good.

 

3. Hire the Best Engineers You Can

 

The key to having good engineering is having good engineers. Google, Facebook, Amazon, Netflix, and Microsoft all run a dizzying number of the largest technology systems in the world, yet, they famously have some of the most selective interview processes while still competing fiercely to recruit the strongest candidates. There is a reason that the salaries for even fresh graduates have gone up so much as these companies have grown, and it is not because they enjoy giving away money.

 

Both Steve Jobs and Mark Zuckerberg have said that the best engineers are at least 10 times more productive than an average engineer. This is not because good engineers write code 10 times faster. It is because they make better decisions that save 10 times the work.

 

A good engineer has a better grasp of existing software they can reuse, thus minimising the parts of the system they have to build from scratch. They have a better grasp of engineering tools, automating away most of the routine aspects of their own job. Automation also means freeing up humans to work on solving unexpected errors, which the best engineers are disproportionately better at. Good engineers themselves design systems that are more robust and easier to understand by others. This has a multiplier effect, letting their colleagues build upon their work much more quickly and reliably. Overall, good engineers are so much more effective not because they produce a lot more code, but because the decisions they make save you from work you did not know could be avoided.

 

This also means that small teams of the best engineers can often build things faster than even very large teams of average engineers. They make good use of available open source code and sophisticated cloud services, and offload mundane tasks onto automated testing and other tools, so they can focus on the creative problem-solving aspects of the job. They rapidly test different ideas with users by prioritising key features and cutting out unimportant work. This is the central thesis of the classic book “The Mythical Man-Month”1: in general, adding more software engineers does not make a project go faster, it only makes it grow bigger.

 

Building software is not about avoiding failure; it is about strategically failing as fast as possible to get the information you need to build something good.

 

Smaller teams of good engineers will also create fewer bugs and security problems than larger teams of average engineers. Similar to writing an essay, the more authors there are, the more coding styles, assumptions, and quirks there are to reconcile in the final composite product, exposing a greater surface area for potential issues to arise. In contrast, a system built by a smaller team of good engineers will be more concise, coherent, and better understood by its creators. You cannot have security without simplicity, and simplicity is rarely the result of large-scale collaborations.

 

The more collaborative an engineering effort, the better the engineers need to be. Problems in an engineer’s code affect not just his work but that of his colleagues as well. In large projects, bad engineers end up creating more work for one another, as errors and poor design choices snowball to create massive issues. Big projects need to be built on solid reliable code modules in an efficient design with very clear assumptions laid out. The better your engineers, the bigger your system can get before it collapses under its own weight. This is why the most successful tech companies insist on the best talent despite their massive size. The hard limit to system complexity is not the quantity of engineering effort, but its quality.

 

Conclusion

 

Good software development starts with building a clear understanding of the problem you want to solve. This lets you test many possible solutions and converge on a good approach. Development is accelerated by reusing the right open source code and cloud services, granting immediate access to established software systems and sophisticated new technology. The development cycle alternates between exploration and consolidation, quickly and messily progressing on new ideas, then focusing and simplifying to keep the complexity manageable. As the project moves forward, it gets tested with successively larger groups of people to eliminate increasingly uncommon problems. Launching is when the real work ramps up for a good development team: layers of automated systems should be built to handle issues quickly and prevent harm to actual users. Ultimately, while there are infinite intricacies to software development, understanding this process provides a basis to tackle the complexities of how to build good software.

 

 

Author: Li Hongyi

カシムラ AC充電器タップ 1m ホワイト AJ-588 1コ入 カシムラ 得価,お得
スパイス 蚊帳 FESTA HOME キャノピー トライアングル ドロップス SFFM1703 代引不可 送料無料 限定セール,セール
アサヒペン 油性トタン用 オーシャンブルー 0.7L アサヒペン お買い得,HOT
エルスール2 機能いっぱい8連ハンガー 20個セット 2020,送料無料
ポルペッタ polpetta グルカサンダル ブラウン メンズ elba mesh tmoro ELBA-MESH 返品送料無料 ラッピング無料 お買い得,最新作
シャープ 空気清浄機用 脱臭フィルター FZ-A80DF 1枚入 シャープ 数量限定,お買い得
タピってグー 1セット
トイ ストーリー4 リアルサイズ トーキングフィギュア ジェシー 1個 ディズニー 玩具
KENZO ケンゾー フラワーバイケンゾー EDT 30mL 人気,最新作
ボッテガヴェネタ BOTTEGA VENETA メッセンジャーバッグ クロスボディバッグ メンズ ギフト プレゼント レザー 本革 590220 vmbi3 9000 SPAZZOLATO CALF 返品送料無料 ラッピング無料 正規品,セール
ハクゾウメディカル 全身洗浄料CoCoemi18L 3009018 送料無料 得価,爆買い
スプリングコイルマットレス シングル 代引き不可 送料無料 安い,高品質
西川リビング シール織シルク毛布 毛羽部分 1787-75003 寝具 6102-024 全国無料,お買い得
ペンドルトン PENDLETON ミニ ブランケット ギフト プレゼント ひざ掛け お祝い 出産祝い ウール コットン zd632 51114 khaki CHIEF JOSEPH JACQUARD MUCHACHO ラッピング無料 返品送料無料 定番人気
メリーナイト SEK抗菌防臭加工 プレート 敷カバー ダブルロングサイズ 145×215cm 送料無料 豊富な,低価
聞き流すだけで英語をマスター 日常英会話 ユーモア編 1枚 定番人気,新品
人感センサー付 ミニセラミックヒーター サンドブラウン 1台 スリーアップ 人気SALE,送料無料
ルーミー 室内物干しスタンド3段 ブルー H-3048 1個 パール金属 安い,最新作
グーン GOO.N スイミングパンツ Mサイズ 男の子用 3枚入*12コセット グーン GOO.N おむつ トイレ ケアグッズ オムツ 新作登場,人気SALE
キング フォトフレーム イレカエアートパネル A1 シルバー 1コ キング king 定番,お買い得
ニコン レーザー距離計 クールショット 40i 1コ入 大人気,定番人気
ワンダーシェフ マイコン 電気圧両鍋 3L 楽ポン OEDC30 R1 1個 ワンダーシェフ 100%新品,高品質
リコー レンズ保護キャップ TL-2 1個 人気定番,豊富な
おすだけノーマットワイド 蚊取り スプレータイプ プロプレミアム 120日分 125ml*2個セット おすだけノーマット お得,100%新品
ワシン 水性ウレタンニス マホガニー 0.7L 数量限定,得価
トイレクイックル トイレ掃除シート ニオイ予防プラス エレガントローズ 詰め替え 16枚入*6袋セット クイックル クイックル つめかえ 詰替え SALE,定番
アスティーグ 冷 ひんやりキープ スキニーベージュ L-LL 1足入*4袋セット アスティーグ ASTIGU お得,豊富な
アサヒペン 無臭 水性建物用 ソフトグレー 1.6L アサヒペン 人気,HOT
アウトレット モンクレール MONCLER レインブーツ ブルー メンズ カジュアル 雨靴 撥水 防水 大きいサイズあり henoc 1034500 019z2 779 HENOC SCARPA 返品送料無料 ラッピング無料
ミクニ ミスティツリー グリーン U900-01 1コ入 ミクニ 送料無料,100%新品
こすってアレンジ ヴィンテージ壁紙シート 幅250*丈45cm よこ貼り 赤レンガ 1枚入 品質保証,豊富な
アウトレット エンポリオアルマーニ EMPORIO ARMANI ネクタイ 剣先幅:7.5cm ピンク メンズ 身だしなみ ギフト アクセサリ ビジネス フォーマル パーティ 仕事 ビジネス 340075 8p601 00070 LINEARE TIE 返
BVLGARI ブルガリ ブループールオム EDT 100mL 人気,得価
アサヒペン 水性スーパーコート グレー 1.6L アサヒペン 100%新品,SALE
カシオ 生活環境お知らせクロック ホワイト DQL-250J-7JF 1コ入 数量限定,送料無料
Hanna Hula ハンナフラ マルチポーチ クッキーフラワーカフェ 1コ入 ハンナフラ マタニティ ママグッズ 最安値,HOT
カバー付 国産ビーズ抱き枕 洗えるカバー 枕 ビーズクッション 送料無料 激安大特価,得価
ポールスミス Paul Smith マフラー ストール メンズ ギフト ワンポイント アクセサリ プレゼント 巻き方 atxc 700d s36 70 ラッピング無料 返品送料無料 170803 最安値,最新作
スリーアール LED拡大鏡 スモリア XC ゴールド 1コ入 2020,大人気
エツミ フィールドザックSLR ブラック VE-4215 1個 爆買い,HOT
ならげた なごみ サーモンピンク*スカイブルー メンズL No.1 1足 ならげた 赤字超特価,品質保証
アサヒ ウィンブルドン W B L048WS ベージ KF79561 23cm 1足 ウィンブルドン WIMBLEDON お買い得,セール
毛布 シングル 140×200cm クロス柄 Jullyadams クッションにもなるブランケット ブランケット ジュリーアダムス ひざ掛け 送料無料 大得価,限定セール
スリッパ 来客用 セット ゆったりヒールアップスリッパかすみ草2色組 代引き不可 送料無料 人気定番
パナソニック 空気清浄機フィルターセット F-Z15ZS 1コ入 パナソニック 数量限定,セール
アウトレット ラスト1点 ディースクエアード DSQUARED2 スニーカー ブラック メンズ snm0101 01500001 m436 251 返品送料無料 ラッピング無料 格安,爆買い
分解できるサーキュレーター グレー 1台 品質保証,2020
ペティオ ポルタ 犬コンパクトスリングキャリーベージュ 犬 イヌ ペット グッズ 送料無料 最安値,100%新品
プラレール トーマス OT-02 おしゃべり パーシー えいごプラス 1コ入 プラレール
レノア オードリュクス イノセント 詰替 特大 700ml*6コセット レノア オードリュクス 柔軟剤 超激得
SK11 WZライトファンベストセット LLサイズ 9180SK-LL 1セット SK11 人気定番,セール
SK 六角軸スパイラルタップ 斬精 M4*0.7 HST-M4 1個 SK
天然素材のコットン100% ボックスシーツ キング 綿100% おしゃれ ベット 洋式 送料無料 超激得,100%新品
カシウエア Kashwere ブランケット グレー t 49 095 52 stone stonecloud 返品送料無料 ラッピング無料 得価,本物保証
杖 軽量 スリムネック ステッキ 伸縮式 パープル 代引不可 赤字超特価
アイリスオーヤマ プラケージ662 ケージ ベージュ662 代引き不可 HOT,最新作
アサヒペン 無臭 水性ビッグ10 カーキー色 1.6L アサヒペン 数量限定,セール
ディオール DIOR バックパック ブラック メンズ 1voba088yky h00n RIDER OBLIQUE JACOUARD 返品送料無料 ラッピング無料 お得,限定セール
温風 送風機付敷布団 ホッタートン ダブル 丸八真綿 マットレス 布団 高級布団 最高級 電気毛布 空調布団 ふとん 送料無料 送料無料,人気
アサヒペン 水性スーパーコート シトラスイエロー 10L アサヒペン SALE,大得価
足裏ふわふわインソール 3足組 安い,正規品
DX ローバウンドポケット 国産 マットレス Q クイーン レッド ニット生地 代引き不可 赤字超特価,送料無料
アウトレット ラルディーニ LARDINI ネクタイ 剣先幅:7cm グリーン メンズ 身だしなみ アクセサリ ギフト プレゼント igcrtp7 51171 17 ラッピング無料 返品送料無料 豊富な,2020
アサヒペン 油性速乾サビドメ グレー ねずみ色 0.7L アサヒペン 新作登場,定番
3M リットマン ステソスコープ クラシックIII セイルブルー シルバー 5630 1器 3M リットマン ステソスコープ 限定セール,大人気
アウトレット アレキサンダーマックイーン ALEXANDER McQUEEN スニーカー ホワイト メンズ シューズ 靴 カジュアル 485250 whgp5 9061 LARRY ラリー 返品送料無料 ラッピング無料 190529 驚きの破格値,新品

カセン和紙工業 和風ペーパーまくらカバー 55cm×92cm 5枚入 WG-001 5個セット 高品質,正規品
ビクセン 双眼鏡 アルテス HR 8.5*45WP 14531-7 1台 HOT,限定SALE
エレコム 充電器 アダプタ 超高速 USB タイプC スマホ タブレット 1個 エレコム ELECOM 人気セール,お買い得
塩こうじ 美人どりんく 送料無料 新作,大得価
アリエール 洗濯洗剤 リビングドライジェルボール3D 詰め替え 18コ入*5コセット tki01 StampgrpA B アリエール 部屋干し 限定セール,大得価
ラクダーネ スパッツ ロング L 1枚入 新品,限定セール
アサヒペン 油性鉄部 木部用EX コゲチャ 1.6L アサヒペン 最安値,2020
マンハッタンポーテージ Manhattan Portage メッセンジャーバッグ リュックサック ブラック メンズ レディース カジュアル バッグ 1106 bk FIXIE WAIST BAG 返品送料無料 ラッピング無料 超激得,新作登場
ポケモン トイレットペーパー 4ロール*20袋セット 人気定番,豊富な
TOA コールドパーミックス カラー 自然色 グレー系 10kg TOA 本物保証,格安
LUMENA コードレス扇風機 LUMENA FAN PRO2 ミント 1台 大人気,本物保証
シンサレート あったか 毛布 クイーン 抗菌防臭加工 洗える 洗える 送料無料 SALE,人気SALE
リラックス整体クッション Beans ビーンズ 送料無料 人気セール,品質保証
ヴァレクストラ Valextra ショルダーバッグ クロスボディバッグ ブラック レディース ギフト プレゼント レザー v5e79 28 n イジィデ 返品送料無料 ラッピング無料 赤字超特価,新品
レイクサイドモーニング 1000-798 1コ入 激安大特価,新品
敷布団 体圧分散 抗菌 防臭 防ダニ 洗える 三層 敷き布団 布団 テイジン 帝人 マイティトップ ダブル ボリューム 送料無料 定番,新作登場
訳あり Bランク アウトレット オロビアンコ Orobianco トートバッグ ブルー メンズ ナイロン アリンナ ワケアリ 訳あり arinna a01 nylon ARINNA-A01 返品交換不可 超激得,2020
ブロックラボ おおきなバイキンじょうとだだんだんブロックバケツ 1セット ブロックラボ
アイリスオーヤマ ペットドライヤー PDR-270 ペット家電 ホワイトPDR-270 代引き不可 品質保証,大人気
ターナー オールドウッドワックス アンティークグレー 350ml*3缶セット ターナー 驚きの破格値,低価
キッチン用品, ダイエット・健康
ダイエット・健康, チャリティー
ライト・照明器具
日用品, 皮革・靴ケア用品
化粧美容用品, 家電, 寝具
家電, 寝具, 掃除・洗濯
メンズバッグ, 寝具, 掃除・洗濯
ライト・照明器具, レディースバッグ
メンズバッグ, メンズファッション小物
文具・卓上用品, 日用品
レディースバッグ, 化粧美容用品
ダイエット・健康, チャリティー
ホーム用品, メンズアクセサリー
皮革・靴ケア用品, 美容・コスメ・香水
ダイエット・健康, 美容・コスメ・香水
ダイエット・健康, 化粧美容用品