The One Cost Engineers and Product Managers Don't Consider

關(guān)鍵詞:Embrace simplicity赛不,擁抱簡單蔫浆;

Kris Gale, VP Engineering at Yammer, joined us recently for First Round CTO Summit and blew everyone away with his talk on "why the traditional engineering organizational structure is dead." He's now back for round two with a new piece on how features can create complexity cost in an engineering organization.

I talk a lot about costs. I believe good engineering is about finding the most cost-effective solution to a problem, whether that cost is measured in dollars, hours, morale or lost opportunities. Some costs are paid immediately and some are assumed as debt. Everyone in business knows this intuitively[直覺地], but some costs are less obvious than others, so it's important to point them out to your team.

Among the most dangerously unconsidered costs is what I've been calling complexity cost. Complexity cost is the debt you accrue[獲得突颊;積累] by complicating[并發(fā);復(fù)雜化] features or technology in order to solve problems. An application that does twenty things is more difficult to refactor than an application that does one thing, so changes to its code will take longer. Sometimes complexity is a necessary cost, but only organizations that fully internalize[使內(nèi)在化] the concept can hope to prevent runaway spending in this area.

For years, the two things that most frustrated me to hear from product managers were "how hard would it be..." and "can't you just..." It took me quite a while to figure out why I had such a strong, visceral[出于本能的] reaction to these phrases. The answer seems obvious now: The work of implementing a feature initially is often a tiny fraction[小部分] of the work to support that feature over the lifetime of a product, and yes, we can "just" code any logic someone dreams up. What might take two weeks right now adds a marginal[邊緣的] cost to every engineering project we'll take on in this product in the future. In fact, I'd argue that the initial time spent implementing a feature is one of the least interesting data points to consider when weighing the cost and benefit of a feature.

It's often subtle[敏感的] or intentionally[故意地] hidden features that cost the most in the long term. Yammer has long had a feature that allows you to begin a message with "to:" and a username to send a private message to someone, or followed by a group name to post to a group. This probably took me an hour to implement, test and deploy back in early 2008. I have easily spent 40 hours of my time -- and, necessarily, 40 hours of others' time -- over the intervening[介于中間的] 5 years explaining this feature and its justification. That's a 40x communications overhead just to carry the feature, even before we consider its impact on people once they get into the code. You might argue that documentation solves this problem, but I assure you that this is well documented in the code... somewhere.

Once you're in the code, the complexity cost gets more obvious. The first time you open a new section of code, you need to orient[使適應(yīng)] yourself. The fewer things the code does, the quicker this process. Even well-factored, well-written, clean code can take a while to become familiar with if it does a lot of things. Anything missed creates rework later: Maybe you break a unit test; maybe you don't and the code makes it to users who report bugs, costing your support or QA team time even before it gets back to cost you more time.

Jim Patterson, Yammer's former head of product, established his team's mission as accelerating the development team. He was specifically talking about figuring out ways to have the product managers and engineers on the same page about carrying complexity cost. This is the kind of relationship you need between your product team and development teams. Everyone owns velocityp[速度], and the least important factor in your engineering team's velocity is how hard everyone is working. Developers need to openly discuss the complexity costs they're paying right now, those they're worried they're taking on with proposed[提議] specs[規(guī)格丧枪,說明書], and to propose alternative product designs that can save complexity.

Your QA and customer service teams will all be more effective if you can keep complexity costs down as well. If an area of your product has two toggles[開關(guān)之斯,觸發(fā)器] that interact, there are 4 states (off-off, on-on, off-on, on-off) that must be tested and that must be understood when working through issues with customers. If it has three toggles, you have 8 states. Four makes 16. The third toggle added 4 states was probably just about as easy to spec and implement as the fourth toggle, which added an additional 8. The same is true of the sixth toggle, which adds 32 states. Again, "how hard would it be to add this toggle?" shows a lack of understanding of total costs. "How much more complicated does it get with this toggle?" gets us closer to the right discussion.

A pathological[病理學(xué)的] example of complexity cost that needs to be driven out of engineering teams entirely is a strange habit I've seen of people carrying bugs forward as features. Here's how this usually works: Behavior in cases not defined in the original requirement ends up working one way or another based on incidental implementation decisions. Eventually, users find and adapt to these things and will report bugs when the logic changes, despite the fact that nobody intentionally designed the behavior the users expect into the system. I've seen systems freshly refactored get shimmed with strange if/then conditionals to explicitly add behavior that used to be an implicit side-effect of the previous implementation. This is allowing entropy[信息熵] to be your product manager and to take on complexity debt. Fight this instinct[本能]. Your product management, QA and development teams should be using judgment to decide what should continue to exist and not just blindly adding everything that used to exist.

Users don't want complexity, either. Unless you've been uniquely disciplined and passionate about keeping your product simple, you'll find that the vast majority of your users are using a tiny minority of your features. Users also pay a complexity cost in the form of cognitive[認知的] overhead when you add things to your product. You might think you've found a way to get complexity for free by making these hidden or advanced features, but you're fooling yourself. I can't count the times I've somehow triggered a hidden feature in software, only to spend an obnoxious amount of time trying to figure out what happened or how to revert it.

On the product side, your best tool for eliminating[消除] complexity cost is data.Studies showthat most product ideas fail to show value, and many even remove value. If you methodically test the impact of each change you make, you can discard those that are negative, but equally relevant to complexity cost, also discard those that are neutral[中立]. A change that doesn't hurt the key performance indicators still hurts the product because it adds complexity debt that must be paid on all future projects. Often, the best thing for a product is taking something away from it.

Beyond establishing the impact of changes, data also helps you to shed[擺脫] complexity over time. All of your features should be logging their usage, and this usage must be made transparent to everyone. Show your team where to find this data, and given them the means to ask how to interpret it if it's unclear. At Yammer, where data is collected on most every feature and is made available to everyone, I've repeatedly seen this pattern: A developer is working in an area of the code and discovers that it will take more than a trivial amount of time to carry a feature forward in a refactor or other change. Instead of blindly taking on that work, he or she will run reports against the usage data to find out whether a given feature is often used. That data can then be run past the product managers who can help decide whether it's sensible to just drop the feature. This can also save time before something even becomes a proposal, because product managers will start by asking how well-used is a feature area they intend to enhance. Many things that seemed like great ideas are revealed to be wastes of time, and complexity is saved.

Train your entire engineering department to understand complexity cost and to use data to keep it down.

Complexity is also introduced by well-meaning people on the implementation side as well. Software developers like challenges, and the challenge of building a complex system that serves up a simple interface is especially alluring[迷人的]. Consider DSLs, abstractions and the attraction to being the one to build a framework that gets leveraged for years. This drives us to introduce huge complexity debt we defend with statements like "it makes it so easy once you understand" and "it will save us so much coding." Writing the lines of code is rarely the big cost in engineering: it's the understanding, the communication and the maintenance.

Embrace[擁抱] simplicity[樸素] in your engineering. The best engineering usually isn't showy[引人注目] or intense-looking[熱情]. Given the same result, the simpler code is more valuable to your organization. This will often be unsatisfying to people's egos[自我], but the best engineers have nothing to prove. I remember early in my career reveling in the documentation part of my project. It was an opportunity to brag[自夸] about how clever the code was, how much it could do, and how easily it was to extend for anyone who took the time to read all this great documentation. I was straight-up giddy[頭暈的] when I got to draw a complex system I'd designed on a whiteboard with boxes, arrows and lines. I was sure this documentation and illustration was proof of what a real engineer I was. When I actually became a real engineer, I realized the simpler I could build something and the less it needed documentation and illustration, the better off my coworkers were -- the faster we could all build the thing we were hired to build.

Embrace simplicity in your product and in your code. The value is in what gets used, not what gets built.

Embrace simplicity even in your communication. Push out a culture of jargon[術(shù)語], acronyms and puffed-up[充滿空氣的] descriptions of things. Celebrate simple, effective communication. Your best people can explain to a child everything that your organization does. Your worst people are the ones who sound smart and official at the expense of being widely understood.

Simplicity is a very hard engineering challenge, but complexity compounds like interest over time. Without keeping simplicity, you will never keep up with competitors who are trying to disrupt you. Make sure your whole team knows this.

轉(zhuǎn)自Kris Gale in firstround.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末日杈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子佑刷,更是在濱河造成了極大的恐慌莉擒,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘫絮,死亡現(xiàn)場離奇詭異涨冀,居然都是意外死亡,警方通過查閱死者的電腦和手機麦萤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門鹿鳖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人壮莹,你說我怎么就攤上這事翅帜。” “怎么了垛孔?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵藕甩,是天一觀的道長。 經(jīng)常有香客問我周荐,道長狭莱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任概作,我火速辦了婚禮腋妙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘讯榕。我一直安慰自己骤素,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布愚屁。 她就那樣靜靜地躺著济竹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪霎槐。 梳的紋絲不亂的頭發(fā)上送浊,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機與錄音丘跌,去河邊找鬼袭景。 笑死,一個胖子當(dāng)著我的面吹牛闭树,可吹牛的內(nèi)容都是我干的耸棒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼报辱,長吁一口氣:“原來是場噩夢啊……” “哼与殃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起碍现,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤幅疼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鸵赫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衣屏,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年辩棒,在試婚紗的時候發(fā)現(xiàn)自己被綠了狼忱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡一睁,死狀恐怖钻弄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情者吁,我是刑警寧澤窘俺,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布衅澈,位于F島的核電站渐排,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纷闺,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一施蜜、第九天 我趴在偏房一處隱蔽的房頂上張望斯够。 院中可真熱鬧啸蜜,春花似錦、人聲如沸实檀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽膳犹。三九已至恬吕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間须床,已是汗流浹背铐料。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留侨颈,地道東北人余赢。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像哈垢,于是被迫代替她去往敵國和親妻柒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容