自己使用C獨立求解問題是從數學建模中的一個過河的游戲開始的,一開始我并沒有想過要使用編程來解決這個問題,但是隨著問題逐步拆解分析,我忽然覺得計算機也可以做這個事情,數學模型離不開數據的訓練,問題一旦抽象為具體的數學模型,就很容易通過計算機編程來解決,這可是計算機最為擅長的事情。也正是這個事情,讓我自己真正認識到C語言的實際作用。不過那時候也只懂得基本的變量、運算符、表達式、控制語句、函數。基礎庫而已,這僅僅只是C語言的皮毛而已。此時,我還無法想象windows程序那操作簡易的窗體界面究竟是怎么實現的,特別每次調試C程序出現的黑屏白字界面。
關于這種帶有界面的程序認知,是Delphi首先教給我的,可能業界很多人首先接觸到的是Visualstudio,我僅僅只是個外行。也許現在的年輕程序員并不懂得什么是Delphi,Delphi如曇花一現,曾經風靡一時,最終急匆匆地退下歷史舞臺,我記得最后一個版本應該是Delphi8。運籌學課上,老師使用他自己編寫的軟件求解動態規劃的問題,而這些軟件就是用Delphi做的,這引起了我的興趣,下載安裝Delphi之后,便立馬建立第一個項目,向導默認會自動創建一個窗體,這讓我非常開心。不過,在我享受Delphi帶給我很多便利的同時,也必然讓我失去了對技術細節的掌握,而這一點認識深深地影響著我后面全部學習過程。與那些從微軟MFC開發起步的同學完全不一樣,我還浮于技術華麗的外表,享受著一點進步的短暫興奮中。Delphi使用的可視化的Pascal語言,是一種面向對象編程語言,對那時候的我來說,與c語言的最大不同之處在于,它封裝了很多技術細節,涉及更多語法層面的東西,要求編程人員更加關注各種庫以及API調用等問題。
C語言的第二次深入學習是從單片機開始的,我始終不會忘記第一次點亮LED燈時的那種興奮勁兒,它讓我整夜都無法入睡單片機的C語法在原標準之上進行了簡單的擴充,比如位定義volatile關鍵字等,因為單片機重點在于控制,因此對于端口操作的位運算比較多,這也讓我進一步理解了位運算的現實意義。那時候不懂什么是上拉電阻、推挽式輸出、漏極開漏輸出、高低電平、寄存器等等、現在想來也挺可笑的,總之,在不斷的自學中,懂得了定時器、看門狗、數碼管、蜂鳴器、紅外遙控、直流電機、步進電機、AD轉換、DS1302,DB1602、24C08、AM2302、LCD等常用器件的基本操作,懂得了UART、IIC、SPI、1-wire常用協議,懂得了如何根據數據手冊上的時序圖編寫相應的驅動程序,也學習了匯編程序設計,雖然單片機開發環境提供了啟動文件的匯編代碼,但是為了搞明白我還是專門學習一下匯編語言,這也讓我對寄存器,內存以及CPU的運行流程有了更為深入的認識。
C語言的第三次深入學習是因為NRF906這款芯片,這是法國Nordic公司生產的一款數字接口無線射頻芯片,自帶鏈路層協議實現,用于無線數據通信,視距1-2公里,具體的通信距離要看功放電路的具體設計了。由于項目涉及無線數控、電機驅動、LCD顯示、繼電器、串口通信等等,繼續采用之前的編碼習慣,代碼變得臃腫和混亂起來,為了更好的組織程序,大量使用了函數、指針、結構體和接口處理,上位機程序采用Delphi編寫,涉及多個模塊,無線數傳是物聯網的一項基礎技術,萬物互聯有了通信的媒介之外,還要有網絡,當時比較熱門的是Zigbee組網技術,TI公司專門針對Zigbee協議提供一系列的軟硬件套件,藍牙、WIFI技術剛開始嶄露頭角,并不像今天這樣大量普及的程度。但是Zigbee因為功耗大的問題沒有得到非常好的應用普及。
二、ARM和μCOS
進入ARM的世界是漫長的,ARM從來不做簡單的事情,對于初學者來說,功能的豐富強大也意味著操作的更加復雜,第一關時鐘配置就卡住了,ARM的時鐘樹在提供豐富的時鐘頻率的同時也帶來了繁瑣的時鐘配置。第三方芯片生產商提供了友好的固件庫,簡化了開發人員的配置操作,由于基礎功底太差,以自己那時的能力根本看不懂ST公司為STM32F10x系列提供的龐大固件庫”笨人就用笨辦法,死看代碼,俗話說先混個面熟,跳轉一個接著一個,歷經幾個月的迷茫,總算是有點眉目,漸漸熟悉了PLL分頻器、PWM、DMA、AHB、CAN、USB、JTAG等模塊配置使用,同時,由于固件庫的巧妙的設計、靈活的編碼、規范的風格,我的C編程功底也有了非常大進步。
當然,隨著硬件功能的豐富,相應的程序設計也就變得更為復雜,也正是因為這個原因,需要移植成熟穩定的操作系統,不會采用編寫裸機程序的方式,操作系統就是將大量通用的重復性設計和代碼進行高度抽象總結,將底層工作機制透明化處理,操作系統作為一款標準化通用平臺。大大減輕了開發人員的工作量,這樣一來能夠讓開發人員更加關注于上層應用,這樣一來,就需要學習嵌入式操作系統μCOS作為一款微型實時系統學習門檻低一些,主要提供:任務調度、事件管理、任務通信、內存管理,雖然這都是最為基礎的知識點,但是對于初學者來說能夠熟練掌握就已經非常不錯了,從裸機到基于操作系統,是認知的一次較大轉變,學會使用μcos是基本的要求,要能夠深入理解其設計思路和運行機制還需要一段過程。理論終歸是理論,理論轉化為具體應用場景下的工程設計和實現,還需要做很多的工作,因此對于初學者來說,μCOS給你的并不是一堆代碼,還有大量的工程設計思想、行業慣例以及常用處理閱讀μCOS代碼,你會為作者嚴謹優秀的編碼風格和習慣所折服,你會為作者巧妙的設計和靈活的處理所折服。此外,順便提一點,μCOS作者的故事也更令人心動不已。
ARM第二個階段學習始于三星S3C2440這款芯片,這也是一款較為成功流行的芯片,與之前的ARM單片機(Cortex-M)不同,這款芯片屬于ARMCortex-A系列,屬于深度嵌入式應用芯片,增加了協處理器和內存管理單元,結構要復雜一些,由于RAM和ROM的外置,電路板的設計也更為復雜,一般核心板都是多層設計,同時,RAM和ROM控制器是必須要獨立提供,既然是高端點的芯片,那么S3C2440就不是用于簡單的控制系統,而是手機平板電腦、醫療設備、工控設備、儀器儀表等等,由于大量的普及使用以及硬件的提升,對于類似這樣的應用場景,在軟件設計中又被剝離出了一個標準化的東西,BSP板級支持包或者Bootloader,現在比較常用的是UBoot,代碼全部公開。應用的廣泛,開發者還要掌握文件系統、網絡協議、圖形界面等組件包的移植使用,嵌入式應用特點就是這樣,根據具體的應用場景軟硬件可裁剪,需要什么就加入什么。但是,隨著這幾年嵌入式硬件性能的不斷提升和linux的大量普及使用,一些組件也作為基礎部件被嵌入到軟件平臺中去,編程功底就是在實際應用中不斷建立起來的,幾年前不理解寄存器、寄存器變量、位圖運算、函數實質指針,編譯,匯編,鏈接,重定位、加載器、動態庫、組件、堆、棧、線程、進程、鏈表、隊列等等好多機制,但是當你經歷了大量豐富的實踐之后,你會突然明白一切原來都是這個樣子,一切并沒有原先想象的那么高深莫測。
三、IIS+ASP+Access
面向對象編程也是如此,它也是工程師經歷長年大量的編程實踐工作中總結出來的,在成為一種成熟穩定的標準之后,交由編程工具進行了處理,對于初學者來說,面對一大堆概念名詞,無法理解這些高度抽象的語法糖,最好的方法還是:不斷寫代碼。第一次認識VisualStudio是因為做網站,那時候ASP還沒有沒落,動易網絡公司還是赫赫有名,桌面程序還是業界主流,今天web應用開發能如此大熱,根本原因在于智能手機和移動互聯網的大量普及,對于小型網站,基本采用“IIS+ASP+Access”的基礎架構,當時對于BS風格的程序還不是很了解,具體的編程工作也只是在現有開源項目上進行小的改動。
C#是一款面向對象編程語言,擁有著大量語法糖,比如引用。集合,泛類、委托,λ表達式·封箱拆箱,LINQ等高級語法特性,此外編譯器也為項目開發提供了注釋,標記特性,單純為了學習而學習,是永遠無法理解這些語法糖,還是需要實際項目的推動,一方面,使用原先的編碼技術實現項目的基本需求;另一方面,通過反復的迭代摻入新的語法特性,提高自己的編碼技術,像單例模式、工廠模式、觀察者模式、策略模式、適配器模式、依賴注入、控制反轉、AOP等面向對象編程設計模式,也是需要在大量的項目實踐中不斷總結出來的,因此,在日常的編碼中要經常性的進行重復迭代,不斷總結思考,只有這樣才能提高編程功底。.NET平臺提供了類似Java JVM一樣的虛擬機機制CLR,橫在了操作系統和上層應用之間,C#編譯后的項目并不是二進制的機器指令,而是IL中間語言代碼,程序運行時由CLR提供實時的翻譯,并轉換為可執行的機器指令。.NET提供了托管內存機制,增強了系統和程序的安全性,提高了程序異常調試能力,對數據庫的操作也是項目開發一項必備僅能。.NET平臺提供了ADO.NET機制,將數據庫訪問機制進行了標準化,這就像設計模式中的適配器模式,數據庫操作的技術細節被隱藏了,各大數據庫廠商針對ADO.NET提供自己的數據庫驅動,便能實現數據庫與應用程序的自由對接。由于項目使用的是Oracle數據庫,除了標準化的SQL語句外,Oracle也有自己專有的SQL語句,為高級開發人員提供特殊功能,在真正做項目的時候才體會到自己的知識是那么的貧瘠,學習的時間是那么的緊缺。
五、GIS
了解GIS技術也是項目的需要。智能手機和移動互聯網出現極大的推動了電子地理信息可視化技術的發展,谷歌地圖、百度地圖、騰訊地圖、高德地圖等等,目前普遍使用的還是二維電子地圖,但是三維電子地圖、全息投影和WebGL等技術還在加快地發展中。對于GIS并沒有去深入學習地理科學方面的知識,只是簡單的了解一些地圖的制圖技術,重點精力放在于GIS組件上,搞清組件的基本工作機制,組件之間的繼承依賴關系,以及組件的調用接口和使用方法等。總之,GIS是包含眾多行業在內的一項綜合性工程技術,GIS軟件的開發需要各專業人員協同配合。
六、WPF和MVVM
本來并沒想著去學習WPF這項技術,但是時代要求走到了這隨著軟件技術的不斷發展和成熟,人們對軟件的要求也越來越高,除了要完成基礎業務功能外,軟件界面的美觀也成為一項關鍵性指標。WPF改變了以往桌面程序的圖形系統,參照WEB程序開發的模式,將界面設計從程序設計中剝離了出來,提出了一種全新的MVVM設計模式。當然,WPF強大圖形系統支持和美觀的界面也必然吃掉了一部分硬件的性能,不過相對于硬件性能提升來說,這點損失還是利大于弊,對于用戶來說只感受到了巨大的利好,此時的我還并不是非常清楚Web程序界面的設計方法,畢竟之前做的很多工作都是Web后端,對于HTML,CSS,JS還是大概知道個模樣,WPF界面設計使用的是XAML語言,和HTML原理類似,也是從XML基礎上發展起來的一種標記語言。WPF程序分離式設計開發、界面和數據的雙向綁定,最終經過編譯器的拼裝組合實現,對于這一點的理解花費了我好長的時間,高級語法特性的難點就在于它隱藏了太多的技術實現細節,讓開發人員失去了對底層工作機制的了解。此外,高級語法特性帶來的是工程建設思路革新,代碼特性只是其中的一個手段,有了MVVM這種設計框架的革新,增強了項目的協同配合,提高了項目的迭代效率,縮短了項目的開發時間,方便了項目的升級維護,延長了軟件的生命周期,大大提升了軟件在市場中的競爭力。
七、虛擬化
最初我對虛擬化的理解就是虛擬機,也許就和VMware公司最先開發虛擬機時想的一樣,當時并沒有想到虛擬化帶來云計算。云服務,虛擬機也可以簡單地理解為仿真機,就是模擬一臺硬件計算機,用戶可以近似像使用一臺計算機那樣操作它,開機,關機、增加硬盤、安裝系統、安裝程序等,但是虛擬機并沒有簡單地停留在這個層面,它在服務器集群中的應用才將其優勢發揮地淋漓盡致,而在這方面應用建設的領頭羊就是VMware公司,其余還包括Citrix,紅帽公司等等。VMwarevSphere就是該公司為服務器集群開發的一套完整的高可用集群解決方案,承擔起了云計算平臺的整個基礎設施建設。因為實際項目建設的需要,我結識了VMware,了解了該公司為企業信息化建設提供的各類解決方案,并為之震驚,起初我們只是為了提高網站的高可用性和安全性,在網上找了許多論文和資料后,偶然得知了VMwarevSphere這套解決方案。逐漸掌握了VMwarevSphere軟件的部署和使用后,才有膽量下定決心使用這套工具,當時最新版本VMWare vSphere5.5。
八、HTML+CSS+JS
服務器集群這個底層基礎設施建好之后,這才有精力考慮上層應用的建設。項目建設實際需要推動了個人在新技術領域的探索,由于采用了開源的網站后臺管理系統,因此開發重點就放在前端,也就是通常所說的HTML+CSS+JS。對于初學者來說,HTML本身并不是很難,難就難在如何使用良好的編碼習慣進行各種組件的設計,對于CSS盒模型的理解是個長期實踐的過程,經歷了場場界面出現的詭異現象之后,才算是對CSS有了切身的認識JS內存模型、原型鏈、閉包、作用域也是在大量編程實踐之后才能有一番清晰地認識。在接連不斷的驚訝和贊嘆中,我認識了Bootstrap、jquery、,AmazeUI、Requires、CofferJS、AngularJS、Backbone、ExtJS、easyUI這些“輪子”,以及Grunt、Webpack、Bower、karma、jazmine等腳手架。雖然沒有技術大拿發明輪子的本事,但是能夠使用好大牛們的輪子,完成自己的項目才是最重要的。只要你有著強烈的好奇心和求知欲,你總是可以對這些事物有著一定程度的認識,至少再次遇見它們時就像與“朋友”的重逢,畢竟親切了一些。
九、 Apache+PHP+MySQL
在做ASP的時候對于PHP就有耳聞,但是此時ASP早已被淘汰,取而代之的是ASP.NET,之所以將目光轉向PHP,是因為PHP活了起來,大量的成熟框架和項目采用PHP編寫,很可惜微軟從ASP過渡到ASP.NET的過程中,被其他語言搶占了市場,盡管ASP.NET提供了很多優秀的語法特性,但是市場的反應并不總是那么迅速,不僅是因為學習需要一個過程,而且整個項目團隊重新形成能力需要更加漫長的過程,這個過程需要大量的資本投入的。就像WPF那樣優秀的技術一樣,并沒有得到很好的市場青睞,對于商業活動來說,投資收益率始終是一個根本問題。因為開源的項目采用了成熟豐富的 Symfony框架,讓我對于PHP框架有了第一直觀印象。在隨后的自建項目中,采用輕量級國產框架Thinkphp以及自己編寫的MVC框架。
十、網絡技術
既然是做互聯網應用,不學習網絡技術怎么行,為了系統的學習網絡技術,報考了網絡工程師資格認證考試,一方面是為了督促自己的學習,另一方面也是檢驗自己的學習效果。剛好結合項目的需要,對網絡布線、IPSEC VPN搭建、交換機和路由器的配置有了一定程度掌握,根據項目需要設計了 Web radius認證審計方案,用以提高網絡安全管理能力。此外,通過使用思科Packet仿真工具,對數據報文進行分析,總結編寫了幾篇關于對ARP、OSPF、TCP分析的文章。
十一、HTTP
隨著web程序開發的逐漸深入,我覺得有必要深入學習一下HTTP,這對提高web程序的安全性有很大助益。HTTP協議的重點在于報文的頭部,為協議內部機制的實現,而報文的主體則是用戶數據,不需要過多關注。《HTTP圖解》是一本非常不錯的書,配合的圖文對有些工作流程機制解釋的比較直觀易懂。學完之后對HTTP的管線化通信機制也有了一定的了解,并通過 wireshark抓包工具進行了驗證性的分析。
十二、 Unity3D和 Webgl
Unity3D出現大大降低了三維游戲的開發難度,就像工具最初被造出來的時候,它的用途還是非常小的,但是在使用者的大量實踐中,工具的用途被推向了更廣的天地。Unity3D作為一款三維游戲開發引擎,并不僅局限于游戲開發,像現在比較火的虛擬現實軟件,就是采用 Unity3D進行開發的。當然,我也是因為項目需要才學習 Unity3D的開發。計算機圖形學是基礎,雖然整個圖形效果的實現被 Unity3D完全封裝了起來,但是計算機圖形學的一些基礎知識還是要有的。 Webgl技術是瀏覽器端提供的種三維渲染機制,也是隨著這幾年Web應用的流行才逐漸被推行出來的一種技術標準,已經被各大瀏覽器廠商納入進去, Unity3D針對BS風格的程序也推出了一套瀏覽器端的asm.js三維引擎組件。目前有著很好的應用前景,作為數據可視化的支持技術受到行業青睞,像百度的 chart、谷歌地球等都建立在 Webgl技術之上。
十三、物聯網
隨著移動互聯網的普及,物聯網似乎又迎來了自己的春天仿佛現在的我們比過去任何時候要更加接近物聯網,物聯網、智能時代是目前最炙手可熱的寵兒。從嵌入式開始,輾轉多個行業,最終又回到了嵌入式。這幾年來,我不斷尋找著出路,在技術上過著顛沛流離生活,卻始終沒有一個好的歸宿。朋友多次勸誡我,要找準一個方向深深地扎下根去。可是現實中的種種情況和變故,讓人難以有清醒的頭腦、清晰的認識、足夠的精力,以及可以努力一輩子方向,在中國這片人才富饒的疆土上,市場的競爭愈演愈烈,全世界互聯網焦點都在我們這里,大牛們層出不窮,發明的輪子數不勝數,Hadoop、Hive、 Spark等大數據開源項目如雨后春筍,各類開發組件、自動化工具、生態系統層出不窮微服務架構、自動編排、 Devops 等一系列新的技術標準、框架,被戲稱為“代碼搬運工”的碼農更是多如牛毛,我有時在想,這種激烈的競爭導致的就是,人們本可以在10年時間里賺的錢,都在1年內賺完了,市場的價格機制并不總能如此快速地匹配實際的供需情況,很多矛盾在時間維度上就被極度壓縮,最終導致整個市場不可持續、不穩定,看似外表繁華實際上是一種“虛胖”大多數程序員并沒有人們想象中那么好,一方面是由于他們自身技術實力的原因,另一方面是由于外部激烈競爭環境的原因。
人生的重大轉折總是因為一些標志性的事情。智能化建立在大數據基礎之上,原始數據的獲取必定要借助于物聯網,這次下定決心再次投身于物聯網,也算是為自己未來事業的發展定下一個總基調,雖然不知道物聯網時代的全面來臨是什么時候,也不知道物聯網時代能夠持續多久,但是有方向總比沒有方向強吧。幾年沒摸的技術都有些手生了,先清理一下灰塵、除除銹蝕,再說吧。
-
編程
+關注
關注
88文章
3644瀏覽量
94139 -
程序員
+關注
關注
4文章
953瀏覽量
29891
發布評論請先 登錄
相關推薦
評論