主頁 > 軟體設計 > 做十年Windows跟十年linux的程式員差距有多大

做十年Windows跟十年linux的程式員差距有多大

2020-11-14 14:29:47 軟體設計

如果一個程式員從來沒有在linux,unix下開發程序式,一直在windows下面開發程式, 同樣是作業10年, 大部分情況下與在linux,unix下面開發10年的程式員水平會差別很大,

我寫這篇文章并不是想貶低windows下面開發的人,做windows開發的人看了可能會感覺不舒服,我并不是這個意思,我只是說說我自己的感受,

我最早開始學習編程也是在windows下面的, 學的是VB,后來轉到VC++,當時用的是VC6.0, 做windows下面的開發5年后轉入linux下面做開發的,開始在linux下面做開發的時候, 也做過很多windows下面的專案,在linux下面做開發確實比我在windows下面做開發多學到了很多的東西,從開源代碼里面吸取了豐富的營養,我不是說我是個高手, 只是說在linux下面學習,你會進步的更快,

不過我需要強調一下,我這里說的是 “大部分情況下”,意思就是說“在同樣勤奮,同樣努力程度,同樣基礎知識,同樣作業年限,同樣是做應用程式的開發” 的情況下,如果說的不對,希望大家在下面發表看法,
可能大家會奇怪, 為何會出現這種情況呢 ?

聽我慢慢道來!


第一:閉源與開源


windows下面的程式基本都是封閉源代碼的,特別是10年前,在windows下可以說找不到可用的開源的軟體,現在的情況比以前好多了, 很多linux下面開源的程式被移植到windows下面來,

但是linux下面開源的程式增加的更多了,
以前在windows下面寫應用程式, 需要用到MFC,WINSOCK,ODBC,FILE IO等, 可以找資料的地方主要是微軟官方的檔案MSDN,也只有MSDN才是最全的地方,下來是第三方網站 vckbase, CSDN, codeproject 這幾個網站,

但是從這些網站找到的代碼,都是針對一個特定的小功能,為了演示如何實作這個小功能而寫的代碼,寫代碼的水平參差不齊,風格各異,都是一些demo性質的小東西,簡單研究看看代碼就可以集成到自己的應用程式里面,

如何構建一個完整的應用程式, 架構良好的應用程式, 大學里面不會教你, 一切都得靠自己摸索,在公司里面做專案獲得提升,直到專案商用,后期維護修改代碼時, 回頭看自己寫的代碼, 才深刻體會到,自己當時寫的代碼架構是多么的不合理,

維護修改是如此的困難,如果在互聯網上找不到自己需要的資料,就只能靠自己想一些實作的方法,雖然功能完成了, 可能完成的時候還很有成就感,但是等那天你突然發現有人實作這個功能,并且用了一個巧妙的方法,

這時你才突然恍悟, 我當時為何就想不到這么實作呢? 在windows下面開發, 不太容易找到可以參考的類似你要完成功能的開源專案,一切都得靠自己,但是在linux下面就不一樣了, 當你要開發一個新專案時,

可以想想有沒有什么開源專案也完成了類似的功能, 可以下載到源代碼來做一個參考, 對其中的演算法, 架構設計等做一個詳細的了解,然后自己開發的時候就會比較得心應手了,可以避免別人犯過的錯誤,少走很多彎路,


第二:要學習的知識量不一樣


學習window下的開發, 你需要學習很多的Windows API,截止到2009年9月,Windows總API數量為2258個, 并且Windows API 的引數多, 引數型別復雜,要記住這么多東西不是一件容易的事情,

至少也和學習一門外語一樣,大學英語四級要求掌握的總詞匯量達到4500個單詞,可想而知, 學會這么多的API用法,有多難了吧,那么學習linux下, 要掌握多少API呢 ? linux下的內核API,

全部算下來也才335,但是這些內核的API只有撰寫驅動的時候才能用到, 開發應用程式基本用不到內核的API,開發應用程式的API基本都是C的API,而 Linux所有的C的API個數是279個,

也就是說你只需要掌握不到300個的API, 就可以順利的在linux下面開發應用程式了,相比學習windows下面的那一堆API來說, 你是不是可以省下很多時間來學習其他知識呢?

下面我就舉個簡單的例子:


CreateFile
ReadFile
OpenFile
WriteFile
DeleteFile
ReadFileEx
WriteFileEx
CloseHandle

上面這些API是windows下面對檔案操作的API, 總共是8個,看看CreateFile的引數吧,
HANDLE WINAPI CreateFile

( __in LPCTSTR lpFileName, __in DWORD dwDesiredAccess, __in DWORD dwShareMode, __in LPSECURITY_ATTRIBUTES lpSecurityAttributes, __in DWORD dwCreationDisposition, __in DWORD dwFlagsAndAttributes, __in HANDLE hTemplateFile);

這些引數的意義和型別, 請問你需要花多少時間來掌握呢 ?
我們在看看linux下面對檔案操作的C的API有幾個,
fopen, fwrite, fread, fclose 共四個,我們在看看引數吧
FILE *fopen( const char *filename, const char *mode ); 兩個引數, 請問你需要花多少時間掌握呢,

可能有的人會提出意見,說上面C的API也能在windows下面運行啊? 沒錯, 是能在windows下面運行,但是你就掌握這跨平臺的C的API夠嗎? 難道所有在windows下面開發的人都喜歡用C的API, 不會用windows本身的API嗎?你不需要學習windows下面的API嗎? 你的同事使用了CreateFile這個函式, 你不需要搞懂他嗎? 你不需要看同事的代碼嗎? 你不需要去維護別人寫過的代碼嗎?

如果你還是這么想,那我還可以再舉其他例子!就拿創建執行緒的例子吧,下面是2個在windows下面創建執行緒的例子, 第一個是創建安全作業執行緒, 第二個是創建界面執行緒,還有一個函式我沒有放下面, 是創建不安全的作業執行緒的,具體的原理大家可以參考《win32多執行緒程式設計》,

作者:(美)Jim Beveridge & Robert Wiener 著,侯捷 譯 這本書,

//執行緒安全的作業執行緒函式 
uintptr_t _beginthreadex
( void *security, unsigned stack_size, unsigned 
( *start_address )( void * ), 
void *arglist, unsigned initflag, unsigned *thrdaddr ); 
//界面執行緒函式 HANDLE WINAPI CreateThread
( __in LPSECURITY_ATTRIBUTES lpThreadAttributes, 
__in SIZE_T dwStackSize, __in LPTHREAD_START_ROUTINE 
lpStartAddress, __in LPVOID lpParameter, __in DWORD 
dwCreationFlags, __out LPDWORD lpThreadId );


做windows下面的開發, 上面兩個創建執行緒的函式我們都必須掌握,當然了, 你也可以只需要知道 _beginthreadex 來在windows下面通吃,但是當看到別人的代碼使用CreateThread的時候, 你可不要不習慣,MFC里面很多人都用CreateThread, 掌握這么多的API累吧 ? 就和你上學的時候背單詞一樣累,

下面我在列一下linux下面創建執行緒的函式

int pthread_create( pthread_t *restrict thread, 
const pthread_attr_t *restrict attr, void 
*(*start_routine)(void*), void *restrict arg);


看到了吧, 你只需要知道這個就可以了,
C的API 絕大部分都可以再windows下面運行,在windows下面學習開發, 你不但要懂得C的API, 你還需要多花時間來學習windows系統本身的API, 你可能要說,

這么說應該是windows下面學得多啊, 我要說的是你掌握的API是很多, 但是對于一個軟體來說, 最最重要的是系統架構,資料結構,架構設計的好, 對后期的代碼維護,功能修改都很關鍵,

這也就是新手寫的代碼, 到最后連他自己本人都很難維護的原因, 更別說讓別人來維護了,
API相當于基本功, 系統架構, 資料結構是內功,基本功練的越快,我們就越有更多的時間來練習內功,練習內功,我們要多向高手學習,
在學習windows 下面開發應用的道路上, 我們需要掌握更多的API, 學習后, 讓我們的路越走越窄, 沒有特別豐富的開源代碼可以參考, 水平提高的速度很慢,
可喜的是, 現在很多開源的專案被很多人移植到了linux下面, 也有很多的開源專案是跨平臺的, 常用的是 wxWidget界面庫, 用法類似MFC, 還有qt這個界面庫,

也很強大,還有開源的3D引擎OGRE, 架構非常好,很值得學習其架構模式,但是linux下面的開源庫要遠遠比windows下面的開源庫豐富得多,

我們可以方便的從高手的代碼里面學習資料結構,學習設計模式,學習編程技巧,這也就是linux下面的程式員, 可能會比windows下面的程式員水平更高的原因

畢竟見多識廣嘛, 熟讀唐詩三百首,不會作詩也會吟啊!


如果你想轉linux卻不知道從哪開始,可以進群973961276跟大家一起學習linux,學習直通車>>c/c++ linux服務器高級架構師

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/215056.html

標籤:其他

上一篇:美團面試掛了后,于是我花幾個月整理了這些面試題

下一篇:成年人的世界都不容易-看看做到年薪50萬的程式員,到底有多累?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more