談「技術含量」的問題

最近又從離職同事那裏聽到這樣的抱怨(緣由),說作的事沒有技術含量。想想,從事車載軟件開發這個行業快8年了,這個話題彷佛曆來沒有停過。我本身曾經也爲本身作的事是否有技術含量而苦惱過,今天就專門花點時間聊一聊。程序員

爲何會以爲沒有技術含量?

真正思考過這個問題的人不多。簡單粗暴地歸納,大部分人(我所遇到的所有)都只是以爲,「這個事我會作了,因此沒有技術含量」。也就是說,他們只是不肯意用已經會的方法,作曾經作過的相似的事。這能夠理解,人們都不喜歡作重複的事。但現實確實是,大部分的工程師的工做,都是用已經掌握的技術,去作相對熟悉的事。由於算法

咱們是在作工程,而不是作研究工具

雖然我一直以爲「軟件工程」相比起其它的工程而言,是愧對「工程」兩個字的,可是畢竟咱們是在作產品,而不是在作科研。作科研中失敗是常態,作產品若是也常常失敗,那公司就完蛋了。那麼怎麼算「成功」?就是在規定的工期內用可接受的成本完成了知足質量要求的產品。要達到這個目標,就要求學習

1、儘可能採用成熟的技術網站

工程師們(程序員們)要對軟件所涉及的技術比較熟悉(知道什麼地方有些什麼坑),並對要開發的產品相對比較熟悉(有行業經驗)。只有這樣,產品才相對有可能在要求的工期內完成。(說話,不少的加班實際上是因爲技能和經驗不足形成的)。若是一個產品涉及到的技術有20%是這個團隊的成員所沒有掌握的,那麼會有80%的機率出問題(工期要超,或是成本要超)。編碼

2、細劃分工,提升效率下降風險設計

5我的幹半年的活,只要有可能,就會安排10我的作3個月。問題域被細分了。這樣每一個人作的事相對比較窄,不少程序員只作一小部分,沒有對整個軟件的把握,不知道本身作的這一塊是作什麼的。因此也每每以爲「沒有什麼成長」。另外,細分的結果是使用工做簡單了。舉個例子,舉個例子,作SSL的通訊協議是比較難的(粗暴地說,比較有「技術含量」),但在工程中每每不是安排一我的把SSL通訊協議作一遍,而是安排多我的去作,某我的完成RAS算法,某我的完成ASN.1編碼,某我的作X.590的支持,某我的作DES等等等……問題細分下去以後,每個小部分會比原來要容易不少,因而參與的人就以爲,沒有什麼「技術含量」了。(是的,細分下去看,全部程序不都是if else for嘛?)開發

這就是「工程」的特質。不一樣的公司會由於各類緣由狀況稍有變化,本質上是相似的。get

難道工做就沒有什麼樂趣和挑戰性了嗎?

固然不是!博客

正如前文所說,軟件工程雖然號稱「工程」,與傳統工程相比卻還有不少差異。一是由於軟件的邊際成本很低,一旦完成,就能夠無限地複製,因此不會有真正意義上的「重複」地生產,軟件開發自己是一個創造性和實驗性並存的過程,它原本就須要試錯(測不許的程序員)。也由於如此軟件工程師能力的「度量」是個很大的問題(創造性是很難度量的)。由於很難知道,某個功能,一個「合格的」工程師應該花多少時間寫完,寫出來的代碼量應該是多少,這樣的代碼在質量上,可維護性上,擴展性上表現如何。遵照流程以及使用熟悉的技術能只在必定程度上保證項目能作到及格。雖然如何精肯定義優秀的工程師是很難的,但項目要想作到出色,優秀的開發工程師確實起決定性做用。這種工程師對新的技術和手法感興趣。他們儘可能在能控制住風險的狀況下,採起一些新的方法和工具來提升效率,嘗試新的設計來提升代碼的維護性和擴展性。這是讓軟件開發工做充滿樂趣和挑戰的部分。

軟件技術發展突飛猛進,並且學習的來源很是普遍,因此,有上進心的程序員們能夠用不少辦法學到不少新東西(開源項目,博客,書,等等),而後在工做中去嘗試本身學到的東西用來提升效率,掌握不一樣技能的程序員之間的效率差異能夠成十上百倍(因此有高手和菜鳥)。在軟件開發的領域,高手幾乎都是靠自學、實踐最終領悟得道的。在這部分程序員看來,手頭上的事老是有新辦法能夠作,新工具能夠嘗試。而且在這個過程當中,工做也越作越好。一樣的事,有很是多的方法作,他們從不以爲不會再有進步了,由於有無數的東西能夠學,學會以後實踐到工做中去。

真正對技術感興趣的人,反而不多會爲「沒有技術含量」這個問題而煩惱。由於他知道全部的問題都存在着更好的解決,只是看你有沒有興趣去找這樣的解法。以爲工做沒有技術含量的人每每是這樣的:期待別人來教本身,從不主動學習和思考。因此在我看來,在軟件開發中,「技術含量」的問題大多數時候只是個僞問題,只是一個藉口而已(有的人意識到了,有的人沒有)。真正熱愛技術的人在離職時也不多用「沒有技術含量」這種籠統的方式來表達,更多的是已經很是清楚本身下一步想作的是什麼,他以爲在哪裏才能獲得更好的環境去作他想作的事。

不是「技術含量」的問題,那是什麼問題?

從上面咱們知道,「是否有技術含量」的問題其實和他們是否真心想作技術沒有多大關係。深一層地追究,其實他們有意或無心中,真實想的是:「這個事我已經會作,我要掌握點其它的知識,用來提高本身的價值(也就是,讓本身在市場上保值或是升值)」。不信?試着想一下這個問題:「給你一份工做,月薪2萬,每一年漲薪15%,保證終身僱傭,工做內容是天天把各大網站的IT新聞收集起來發給經理」,你是否願意接受這份工做?若是願意,那麼你根本就不在乎「技術含量」這個事兒。你是在意「錢」。

這沒有什麼很差意思認可的,追求好的生活天經地義。那麼你們天然會關心

什麼能力是值錢的?

市場上稀缺的纔多是值錢的。

這點你們都很清楚。十年前很是流行「程序員是吃青春飯」的這種說法,如今要少一些了。那時所謂程序員們所作的事都處在行業鏈下游,須要的技能大多數沒有多少門檻。新人也很容易就能掌握,談不上稀缺。隨着行業的發展,這個情況逐漸在發生變化。也就愈來愈須要一些高端的人才了。這些人才大概會有下面這些特色:

1. 在某些領域有比較豐富的經驗(業務和技術方向)

新人通常學了一段時間以後都會以爲「這也不過如此」,但有經驗的人都知道,「其實水很深」。這種過來人的閱歷在項目中是很是重要的。有這種經驗的人比較不容易犯錯,也不會輕視可能出現的困難。另外,他們的抗壓能力也比較好,遇到以前沒出現過的問題不會慌了手腳或是一籌莫展。他們大概會知道還有什麼辦法能夠嘗試,有什麼人能夠求助。每一個領域,都有一些很特殊的問題,至少要經歷好幾個項目纔會有所把握的經驗。擁有這些經驗的人在對風險的控制能力要強得多(最直接的結果就是加班會少)。在設計的前期也能預見性地解決大部分可能出現的問題,而避免在項目後期疲於解決bug的狀況。並且每一個項目都會有幾個很難解決的bug,須要至關的技術和經驗才能搞定。

要作到這一點,須要長時間在某個領域的積累,不經過遇到和解決大量的問題,是很可貴到提升的。

2. 有較強的學習能力

前面說過,程序員們幾乎不會作真正重複的東西。學習能力對於軟件開發來講無比重要。這一點你們都很清楚。學習能力來自哪裏?一是獨立和積極地思考。這一點其實很是重要,這直接影響到學習的效果。二是基礎好。如今想來,大學學的那些課程,都是很是重要的。由於快速地學習能力絕對是基於這些基礎的。三是經驗,舊有的經驗每每能加快新領域的學習。會C#再學Java,就再也不須要花一樣多的時間了。

3. 帶團隊的能力

這一點幾乎不須要展開說。但確又是很多人內心不太願意認可的。特別是不善溝通的技術人,每每在內心看不起那些技術並非最好,但溝通能力、計劃能力方面很平衡而當上Leader的同事。但現實就是,一個團隊除了極少一兩我的能在技術上給團隊帶來很大價值以外(他們能解決99%的程序員不能解決的問題),其它程序員的水平差異並不會顯著到不一樣的量級上。能帶一個團隊(幾個到幾十人)作好一件事,反而是比較稀有的能力。

因此,其實那些以所謂沒有技術含量而離職的人,不少人後續發展並很差,由於他們老是歸咎於環境,不主動實踐和思考,而且由於不夠穩定而在從事過的事方面都沒有深刻的積累,反而使得本身沒有多少「特別的價值」可言。

非常惋惜。

時間比較倉促,不少點沒有能展開寫。之後有機會再談。

相關文章
相關標籤/搜索