摘要:解決問題的心態(tài)軟件工程師不認(rèn)為編程是他們事業(yè)的全部。好的軟件工程師以經(jīng)驗(yàn)和直覺判定。環(huán)境與測(cè)試軟件工程師寫的程序要保證在不同環(huán)境,不同時(shí)區(qū)正常工作。軟件缺陷是不可見的,我們預(yù)測(cè)和避免缺陷的能力也是有限的,所以軟件工程師懂得利用工具矯正代碼。
原文 Software Engineering is different from Programming
一些人因?yàn)椤肮こ獭边@個(gè)詞而不喜歡軟件工程師這個(gè)術(shù)語。這篇文章跟這個(gè)術(shù)語沒什么關(guān)系,你不喜歡的話完全可以把這個(gè)詞替換掉,改成軟件作者、軟件冒險(xiǎn)家或者軟件藝術(shù)家!
軟件工程師,把編寫高質(zhì)量軟件作為他們的專業(yè),把科學(xué)和統(tǒng)計(jì)學(xué)融入其中,而不只是把寫軟件當(dāng)成賺錢工具。
知道怎么編程不代表你就是軟件工程師。
誰都可以學(xué)習(xí)編程,這很簡(jiǎn)單,每個(gè)人都可以寫一些簡(jiǎn)單的代碼,這些代碼可以運(yùn)行在他們的機(jī)器上,但不能保證其他機(jī)器能否運(yùn)行。
類比一下:
我們可以學(xué)數(shù)學(xué)但是這不一定能讓我們編程數(shù)學(xué)家
大多數(shù)人都可以學(xué)會(huì)煮飯,但是正式場(chǎng)合我們還是會(huì)請(qǐng)廚師做這件事
你不能叫住你隔壁的勤雜工給你蓋個(gè)房子
我是想告訴大家,構(gòu)建一個(gè)軟件比編程難多了。
最簡(jiǎn)單的編程是,輸入數(shù)據(jù)到電腦,處理后輸出數(shù)據(jù)。
而構(gòu)建一個(gè)軟件是集設(shè)計(jì)、編寫、測(cè)試和維護(hù)于一身的,其目的是要滿足用戶的需求。這要求創(chuàng)建健壯的代碼,經(jīng)得起時(shí)間考驗(yàn)的安全解決方案,有時(shí)候還不得不面對(duì)一些未知的問題。
軟件工程師要深入理解他們要解決的問題、他們要提供的解決方案、這些方案的局限,以及一些隱私安全問題。
如果一個(gè)人沒有深入了解一個(gè)問題,他們就沒辦法讓程序去解決這個(gè)問題。解決問題的心態(tài)
軟件工程師不認(rèn)為編程是他們事業(yè)的全部。他們要思考的是如何滿足需求和解決問題。不是每個(gè)問題都需要寫程序解決的,而是依賴現(xiàn)成的程序,或者結(jié)合多個(gè)程序。提早的準(zhǔn)備可以避免很多問題,好的程序通常需要詳盡的計(jì)劃來預(yù)防未來出現(xiàn)的問題。
知識(shí)分子解決問題,而天才會(huì)防止問題出現(xiàn)。 -愛因斯坦
復(fù)雜的問題需要多個(gè)程序組合才能解決,有的需要程序并行運(yùn)行,而有的需要順序運(yùn)行。當(dāng)然還有一些問題,可以通過教育用戶來解決。(譯者:所謂的解決提出問題的人嗎?)
寫程序及構(gòu)建軟件之前先問自己:
我需要解決什么問題?
除了寫代碼還有什么方法解決問題?
用代碼如何讓問題變得更容易解決?
代碼質(zhì)量好程序是簡(jiǎn)潔易讀的,容易擴(kuò)展的。他們可以和其他程序協(xié)作得很好,維護(hù)起來也很舒服。高質(zhì)量代碼是必須的,因?yàn)樗谰€和心情不好而偷工減料是絕對(duì)不可取的。
構(gòu)建軟件重要的一點(diǎn)是貫徹可延展性,你總要更新軟件以滿足用戶更多的要求。
一個(gè)多帶帶的軟件有時(shí)可能不是很有用。當(dāng)多個(gè)軟件互相交流,交換數(shù)據(jù),合作呈現(xiàn)數(shù)據(jù)和與用戶交互,這個(gè)軟件才會(huì)變得有意義。
程序設(shè)計(jì)要時(shí)刻思考這些問題。他們接受什么信息?應(yīng)該監(jiān)聽什么事件?什么信息被觸發(fā)?通信間授權(quán)怎么做?
另一個(gè)重點(diǎn)是代碼要清晰,而不是給出一大堆測(cè)試結(jié)果。這段代碼可以被別人簡(jiǎn)單理解嗎?你今天寫的代碼,幾個(gè)星期后的自己能看懂嗎?
計(jì)算機(jī)科學(xué)里只有兩大難事:命名和緩存失效。 -Phil Karlton
代碼可讀性比你想象的更重要。但是很不幸的是,沒有很好的準(zhǔn)則判定代碼可讀性。記住一些設(shè)計(jì)模式和更多的實(shí)踐會(huì)帶來幫助,但這不一定足夠。好的軟件工程師以經(jīng)驗(yàn)和直覺判定。(要不要寫得這么玄學(xué))
我沒時(shí)間寫一封短信,所以我決定寫一封長(zhǎng)的。 -馬克吐溫
出錯(cuò)時(shí)容易修復(fù)的程序才是好程序。發(fā)生錯(cuò)誤時(shí)我們應(yīng)該可以清晰地看到錯(cuò)誤報(bào)告,并且可以從錯(cuò)誤報(bào)告定位到程序出錯(cuò)位置,修復(fù)人員可以很容易地看懂上下文并修復(fù)系統(tǒng)。
環(huán)境與測(cè)試軟件工程師寫的程序要保證在不同環(huán)境,不同時(shí)區(qū)正常工作。軟件要運(yùn)行在不同大小的屏幕,還包括屏幕旋轉(zhuǎn),甚至還要考慮機(jī)器性能和功率問題。
例如我們?yōu)榫W(wǎng)絡(luò)瀏覽器設(shè)計(jì)一個(gè)軟件,我們就要考慮到適配所有主流瀏覽器。桌面應(yīng)用就要考慮到Mac和Windows甚至是Linux用戶。一個(gè)依賴數(shù)據(jù)的軟件在處理無法檢索數(shù)據(jù)或檢索緩慢時(shí)應(yīng)有對(duì)策。
要寫一個(gè)軟件,軟件工程師需要考慮各種不同的應(yīng)用場(chǎng)景,然后測(cè)試這些場(chǎng)景。雖然意外沒有發(fā)生,但是仍要列出這些可能發(fā)生的意外,測(cè)試他們。右側(cè)軟件工程師會(huì)先寫測(cè)試用例,然后讓他們的目標(biāo)代碼都通過這些測(cè)試。
工程師知道軟件需求有時(shí)候是模糊或者不完善的。有天賦的工程師的獨(dú)有技能不是知道怎么寫解決方案,而是清楚有什么問題需要解決。
成本和效率軟件工程師在大多數(shù)情況下可以快速解決問題。如果你覺得聘請(qǐng)一個(gè)優(yōu)秀工程師成本很高,請(qǐng)你三思。你聘請(qǐng)優(yōu)秀的工程師,他們提供健壯、精準(zhǔn)、可信、可維護(hù)的解決方案。這以為這長(zhǎng)期成本的大大降低。你需要考慮運(yùn)營(yíng)軟件的成本。每個(gè)程序都要占用電腦資源,但是高效的軟件可以大大節(jié)省資源。如果你雇一個(gè)初學(xué)者給你構(gòu)建軟件,價(jià)格可能很便宜,但是后來的支出可能會(huì)非常高,還有一大堆遺留問題。
可用性好的程序需要考慮用戶體驗(yàn)。人機(jī)交互是一個(gè)大熱點(diǎn),無數(shù)研究都與他有關(guān)。
讓我給你一下例子讓你感受一下這一點(diǎn):
設(shè)計(jì)輸入表單時(shí),如果是郵箱地址,就應(yīng)該無視大小寫,并去除頭尾空格。如果是接受一個(gè)新的郵箱地址,提早驗(yàn)證是否可用并給出清楚的信息。重點(diǎn)不只是判斷有沒有@,也應(yīng)該順便判斷用戶有沒有像“gmail.ocm.”的錯(cuò)誤輸入
使用重定向的時(shí)候,一個(gè)好程序會(huì)記下重定向前的地址,重定向處理完成之后應(yīng)該回到原來的地址。更好的話,應(yīng)該吧之前的表單信息也記錄下來。例如你要買機(jī)票,找好了某一班機(jī),但是注冊(cè)之后又要重新搜索,這樣用戶體驗(yàn)就不是很好。
好程序?yàn)橛脩魣?chǎng)景設(shè)計(jì)。站在用戶的角度思考。不要只加 feature 不管后事!一次我訂機(jī)票忘了我的飛行??吞?hào)碼。前前后后搞了十分鐘。我在網(wǎng)站找這個(gè)號(hào)碼,沒有明顯路徑可以讓我找到,在找到的那個(gè)頁面還把這個(gè)選項(xiàng)埋在一個(gè)大表格里面,進(jìn)去之后我還填了 20 個(gè)選項(xiàng)甚至是手機(jī)號(hào)碼都填了,最后才搞定,這就是不為用戶設(shè)想的例子。
可靠性、安全性、穩(wěn)定性這可能是區(qū)分軟件行業(yè)專業(yè)和業(yè)余的重要一點(diǎn)。他們知道他們要提供安全和穩(wěn)定的解決方案。
好的軟件對(duì)惡意輸入、錯(cuò)誤狀態(tài)和錯(cuò)誤交互都有所對(duì)策。這很難全部做到,也因此讓大家覺得軟件錯(cuò)誤讓人痛不欲生。
用戶會(huì)對(duì)軟件進(jìn)行錯(cuò)誤的輸入,有些情況是惡意輸入,目的是破壞軟件或者是黑一些數(shù)據(jù)。最近的 Equifax 事件負(fù)責(zé)人就被指責(zé)沒有盡職于惡意輸入的對(duì)策。
安全問題不只是關(guān)于惡意輸入,普通輸入也有注意點(diǎn)。如果用戶忘記密碼,你會(huì)允許他們嘗試輸入多少次?會(huì)凍結(jié)他們的賬號(hào)嗎?如果是其他人讓他們凍結(jié)呢?你會(huì)不會(huì)讓你的用戶在非加密鏈接輸入密碼?不在常用地點(diǎn)又怎么辦呢?
你如何保護(hù)用戶,避免跨站腳本、偽造請(qǐng)求、中間人攻擊和網(wǎng)絡(luò)釣魚?后臺(tái)有對(duì)抗DDoS攻擊的策略嗎?這都是一些常見問題的名字,我們應(yīng)該首先關(guān)注的。安全的程序不會(huì)明文儲(chǔ)存敏感信息而是用復(fù)雜的算法加密數(shù)據(jù),這樣黑客拿到數(shù)據(jù)也沒什么用。
軟件會(huì)犯錯(cuò),并且必須要修正。即使是最好的軟件也會(huì)出問題。如果你沒有意識(shí)到這個(gè),而沒有為此做計(jì)劃和對(duì)策,那么你就不是軟件專家,只是一個(gè)不安全程序的寫手而已。
軟件缺陷是不可見的,我們預(yù)測(cè)和避免缺陷的能力也是有限的,所以軟件工程師懂得利用工具矯正代碼。
擁抱工具毫無疑問我們需要更多更好的工具。工具十分有用,但卻常常被低估。試想一下我們沒有 Chrome 開發(fā)者工具 debug 和檢測(cè)性能表現(xiàn)!試想一下沒了 ESLint 和 Prettier 我們的效率會(huì)多么低!
如果你是個(gè) JavaScript 開發(fā)者,被迫只能在編輯器裝一個(gè)插件,那么你應(yīng)該選擇 ESLint。
可以在你編寫代碼時(shí)縮短反饋回路的工具,我們都可以嘗試使用。Bret Victor 的 inventing immediate visual representations 觀點(diǎn)讓我大開眼界。擁抱和改善工具讓我們有一個(gè)美好的前程,如果前面的視頻你沒看過,那就趕緊觀看學(xué)習(xí)一下。
每當(dāng)我找到一個(gè)好工具,我的感覺都是相逢恨晚,好工具能幫助你成為更好的程序員,找到他們,使用他們,欣賞他們,如果可以的話,你甚至可以完善他們,幫助更多的人。
對(duì)于類型安全問題,在JavaScript領(lǐng)域最好的就是TS和Flow了。靜態(tài)類型的重要性比你想的更重要,如果不是這樣,你的代碼未來可能會(huì)很脆弱。盡量不要使用動(dòng)態(tài)類型,如果你的語言是動(dòng)態(tài)的話,最好換一個(gè)語言,或者找個(gè)轉(zhuǎn)譯器。現(xiàn)在的轉(zhuǎn)譯器已經(jīng)智能到從注釋入手轉(zhuǎn)譯,我覺得未來動(dòng)態(tài)語言都需要這東西。
軟件工程師的進(jìn)化兩個(gè)月,半年,甚至一年精通軟件工程是不可能的,你別去上什么培訓(xùn)班去學(xué)這個(gè)。我學(xué)了二十多年,直到現(xiàn)在還在學(xué)習(xí)。而我學(xué)了十年,構(gòu)建和維護(hù)了上千上萬人使用的程序,才敢自信地說一個(gè)有經(jīng)驗(yàn)的軟件工程師。
不是每個(gè)人都要當(dāng)軟件工程師,但是每個(gè)人都應(yīng)該學(xué)會(huì)用電腦解決他們的問題。你應(yīng)該力所能及地學(xué)習(xí)一下寫程序。問題層出不窮,軟件工程也應(yīng)不斷進(jìn)步。這個(gè)行業(yè)的未來是讓普通電腦用戶可以不用學(xué)習(xí)很久就能簡(jiǎn)單完成一些工作,可以讓用戶用一些簡(jiǎn)單工具解決他們的問題。軟件工程師則是研究更好的工具,解決更多已知問題,然后避免未知問題的發(fā)生。
感謝閱讀這篇文章。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89230.html
摘要:前言最近服務(wù)器被黑客做了肉雞,前后已經(jīng)折騰了兩次碼農(nóng)的黑客反擊戰(zhàn),碼農(nóng)的黑客反擊戰(zhàn)二,查殺病毒文件,修改服務(wù)器默認(rèn)配置,經(jīng)過觀察發(fā)現(xiàn),依然沒有完全清除干凈。至此,只能宣布黑客反擊戰(zhàn)其實(shí)算不上反擊,只是修復(fù)失敗。 前言 最近服務(wù)器被黑客做了肉雞,前后已經(jīng)折騰了兩次(碼農(nóng)的黑客反擊戰(zhàn),碼農(nóng)的黑客反擊戰(zhàn)(二)),查殺病毒文件,修改服務(wù)器默認(rèn)配置,經(jīng)過觀察發(fā)現(xiàn),依然沒有完全清除干凈。具體表現(xiàn)為...
摘要:新生代農(nóng)民工就業(yè)薪資,程序員最高在調(diào)查樣本中,從事信息傳輸軟件和信息技術(shù)服務(wù)業(yè)的新生代農(nóng)民工比例為,是所有行業(yè)中增幅最大的一個(gè)。調(diào)查樣本中,新生代農(nóng)民工月均收入元,比上年增加元,增長(zhǎng)。 ...
摘要:我是一個(gè)碼農(nóng)什么是碼農(nóng)百度百科的定義是一般指從事軟件開發(fā)職位的職員,學(xué)不到新技術(shù),同時(shí)也是部分從事軟件開發(fā)工作人員的一個(gè)自嘲的稱號(hào)。我是一個(gè)家有果園的老碼農(nóng)。應(yīng)該做一個(gè)寫寫代碼,賣賣水果,也打理自己果園的碼農(nóng)了。 我是一個(gè)碼農(nóng) showImg(/img/bVEenN?w=550&h=306); 什么是碼農(nóng)?百度百科的定義是:一般指從事軟件開發(fā)職位的職員,學(xué)不到新技術(shù),同時(shí)也是部分從事軟...
閱讀 3582·2021-11-22 15:11
閱讀 4691·2021-11-18 13:15
閱讀 2726·2019-08-29 14:08
閱讀 3607·2019-08-26 13:49
閱讀 3117·2019-08-26 12:17
閱讀 3316·2019-08-26 11:54
閱讀 3139·2019-08-26 10:58
閱讀 2060·2019-08-26 10:21