一轉眼2016年都過去了,我已經離開學校兩年。
這兩年中感覺自己成長了很多。在此對過去一年工作學習生活中的經驗體會做一個比較主觀和抽象的總結。
##一、思想:面向資料的程式設計
要說在過去一年的工作實踐中,我最大的成果,不是什麼產品,而是想到了一個新的角度去看待程式:
面向資料的程式設計
要做一個優秀的程式設計師,首先就要脫離“Java程式設計師”,“IOS工程師”,“前端工程師”,“後端工程師”這些狹隘的定位。我嘗試去思考編碼的本質是什麼。我們每天敲的程式碼到底都幹了什麼。
最後基於我現有的見識和理解。有了一個不是很成熟,但是基本適用於我的現狀的結論:
我們是在運算元據。
將且僅將資料作為程式世界唯一的一等公民,拋開什麼語言什麼平臺之類的東西,我們說到底,每天都只是在和資料打交道而已。
這話聽起來很大很扯,很抽象很神棍。當然這套理論不可能解決所有的問題,但是我認為這是一種行之有效的,確實給了我很大幫助的程式設計觀。
在這一套觀點中,寫一段程式碼,我們不外乎要對資料做增刪改查操作而已。
至於具體怎麼實現的,這是語言的,是演算法的,是次要的東西。
確認了這一點,就很容易跳出某種語言,某個位置,而去整體的觀察和理解程式,理解軟體這個東西。
下面舉幾個基本的例子,比如說快速排序演算法。
具體快速排序的演算法就不多說了,首先我們要確認幾個資料。
首先,待排序的資料,這個毋庸置疑。很多人認為資料僅僅指這個陣列,但是於我而言,我看到的還有其它的資料。
比如指向位置的指標資料,做中軸的數值也是資料。
那麼搞清楚這些資料的意義在哪呢?搞清楚了他們,演算法本質是對資料的操作。當我們弄清了演算法,就是弄清了如何對資料進行操作,那麼具體用什麼方法,什麼語言去實現,就不是一件難事了。
比如快速排序,我們要做以下工作:
-
對比指標指向的資料和中軸的資料
-
將兩個指標指向的資料做交換
-
修改指標資料
然後重複。
那麼寫出程式碼還很困難麼?
基於以上的例子,我想說明一個什麼呢。
在學習和幫助別人學習的過程中,我發現了兩個很重要的問題:
1、很多人知道要做什麼,但是不知道怎麼去做。
2、很多人拿到了一個開源的程式碼,但是不知道怎麼去看。
這個面向資料程式設計的思想,是我解決這兩個問題的利器。
一個積分看不懂,那就拆成一加一去看。把常用的程式語言加在一起,對資料的操作也就那麼幾個,程式也就三大結構。這是誰都能很輕鬆學得會的。
剩下的問題就是把很複雜的東西拆成這些簡單易懂的基本操作。比如對快速排序的實現。
而一個專案的程式碼看不懂,那就不要死看程式碼,看他對資料做了什麼。最簡單的,看資料從哪來,經過了哪裡,最後成了什麼樣子,到了哪裡。對於理解一個專案而言就很快捷了。
##二、工作:程式設計師之所以是程式設計師
現在有一個論調,說隨著計算機技術的普及,最後會達到人人都是程式設計師的共產主義世界。
這個論調引發了我的思考,那就程式設計師為什麼是程式設計師。
其實拆解了這個論調,這其中有一個轉換,恰恰是一個關鍵:
計算機技術普及->大家都會寫程式碼->大家都是程式設計師
那麼重點就在於,會寫程式碼≠程式設計師。
於是問題就來了:除了會寫程式碼之外,差別在哪呢。
其實說起來,現在很多高階科研人員都寫得一手好程式碼。尤其是做理科研究的。但是他們若是出來找程式設計師的工作,卻不一定能夠做得好。
其實抽象起來說,程式設計師不僅僅是會寫程式碼,而是會完成一個專案。
那麼作為一個程式設計師,要保證自己的競爭力,那就必須要提升自己的全面素質,而不是做一個會寫程式碼的普通人。
寫程式碼距離寫專案,有多遠呢?有一個軟體工程那麼遠。
軟體工程,這個詞很少有人提及。但是不論是流行全棧也好,流行敏捷開發也好,這都是屬於軟體工程的一部分。
說到軟體工程,人們可能第一想到的是人月神話,然後想到這是一門管理的學問。
這並不僅僅是管理人,管理專案的學問。這是一門融入到我們每一行程式碼的學問。所以這不是隻有管理者才需要關注的學科,而切實是每一個程式設計師都應當懂得的知識。
當寫程式碼的時候,我要思考的不應當僅僅是如何實現這一個功能,而是完成一個簡潔,安全,可靠,可讀性高,便於修改,隨時擴充套件的功能模組。
這些瑣碎的要求就是程式設計師與寫程式碼之間的距離。
磨刀不誤砍柴工,這句話直到現在才切實的理解。
寫程式碼真的不應該是一個程式設計師最重要的工作。而僅僅是實現工作的一個手段。
少思考一點,快點寫程式碼,最後往往會花更多的時間去彌補程式碼的缺陷。
記得有個故事,說“畫一條線值一美元,知道在哪劃線值9999美元”
程式設計師也是如此,寫程式碼不是什麼值錢的工作,知道怎麼寫好程式碼,才是一個程式設計師最大的價值。
##三、生活:我們距離他們其實很遙遠
在程式設計師的圈子呆久了,我們會產生這樣的錯覺。
每個人都能很熟練的用電腦。每個人都切實的知道電腦能做什麼,在做什麼。
然而每次遇到圈外的人,都會深刻的體會到我們之間到底有了多大的裂痕。
其實這樣的問題在每一個圈子裡都應當存在。但是唯獨在計算機這個圈子裡,顯得尤為突兀。
因為就算人手一個智慧手機的今天,還是有絕大部分人對於計算機幾乎一無所知。
前一陣我的一個親戚買了一個新手機。她是當年的大學本科畢業,高中教師。但是她看著開機提示的“是否啟用華為會員”,和下面的“啟用”和“跳過”選項不知所措。
這幾乎是無法可想的事情,但是切切實實的在發生,還是發生在一個學歷水平不低,含金量很高,才剛到中年的“高階知識分子”身上。
與其說是不知道,倒不如說是畏懼。
很多人在每天迷戀於計算機的時候,也在畏懼計算機,畏懼網際網路。
“我哪敢亂碰,萬一壞了呢。”
“我不敢亂點,萬一花錢了呢。”
“我搞這個幹啥,萬一把資訊洩露了呢”
這是我最常聽到的說法。作為這個圈子裡的人,很難理解他們的那種畏懼心理。但是如果換個角度,將我們扔在一個放滿了各種試劑的化學實驗室裡,應該也會很擔心萬一爆炸了怎麼辦吧。
但是計算機不是化學試劑啊,它是電,它是水,它是火,是我們生活中不可或缺的一部分。
年輕一代的人伴隨著網際網路成長,在最無知無畏的年紀裡就積累了大量的經驗,探索了足夠的知識疆域。他們對於計算機的瞭解就更加深入和普及。
但是新一代還很少,有足夠條件伴隨網際網路成長的新一代其實比想象中要少得多。
所以說,其實計算機距離人們還太遙遠。
至少,人們聽到程式設計師,第一反應依舊是可以修電腦。
但是計算機又距離人們太近,與人們一點一滴的生活息息相關。
這帶來了一個很尷尬的局面:太多的人無法正確的理解我們工作的價值。
諸如話少錢多死得快,坐辦公室領高薪,乃至加班多,都是這種問題的一個體現。
無法理解價值,也就意味著無法正確理解這個工作的內容。
很多人將程式設計師作為求職失敗後的一條出路,殊不知這條出路向來不是誰都能走得通的坦途。碼農都說自己在搬磚,但真的不是簡單的搬磚工。
我見過一些人,來自各種奇怪的專業,培訓過後來求職。沒有半點系統的知識結構,乃至於對電腦的基本使用都不流暢。每當這種時候真的想問一句何苦來哉。
我清楚地認識到了,我們距離他們真的很遙遠。貌似熟知,但是卻更加遙遠。人們都知道化學很難,物理很難,律師很難,會計很難。但是偏偏卻看不到一個合格的程式設計師也很難。
而我們走在這條可能很難的道路上,回頭看去已經走了很遠,遠到需要身邊的圈外人提醒你,你所學的東西,真的很難。
這是我們的困境,也是我們的價值。