標籤:

為什麼我時不時會看到「珍惜生命,遠離 C++」?

所以我疑惑,到底是因為他們水平差,還是因為c++真的難學難用?


竟然沒人舉實例,我給一個吧……

1.#include"stdio.h"
2.#include"sparsepp-master/sparsepp.h"
3.int main()
4.{
5. spp::sparse_hash_map&,int&> mp;
6.mp.insert(std::make_pair(std::make_pair(1,1),1));
7.return 0;
8.}

這個程序時使用sparsepp庫提供的hash版map來存數據的例子,但他有一個錯誤:庫中並沒有給出為std::pair&產生hash值的演算法,因此該程序不能工作。

理想情況下我們想要編譯器這麼提示我們:「親愛的程序員,您的程序這裡有錯,錯誤原因和解決方法我都給你標註好了,么么嗒~~~」

具體錯誤提示大概長這樣:

line 6:mp.insert(std::make_pair(std::make_pair(1,1),1));
^^^^^^^^^^^^^^^^^^^ can"t generate serialization

但實際上有點困難,一般編譯器只會這麼提示我們:「吔屎啦,這裡這裡這裡這裡這裡這裡我都看不懂,趕緊給老娘改!」

JAVA和javascript就喜歡這麼干,錯誤提示大概長這樣:

In file sparsepp-master/sparsepp.h:1483:42: XXXXXX
In file sparsepp-master/sparsepp.h:5069:77: XXXXXX
In file main.cpp:6:25: type cast failed
In file main.cpp:3:1: XXXXX

而混亂邪惡的C++是這樣提示我們的:


In file included from main.cpp:2:0:
sparsepp-master/sparsepp.h: In instantiation of "size_t spp::spp_hash&::operator()(const T) const [with T = std::pair&; size_t = long long unsigned int]":
sparsepp-master/sparsepp.h:1483:42: required from "size_t spp::sparsehash_internal::sh_hashtable_settings&::hash(const key_type) const [with Key = std::pair&; HashFunc = spp::spp_hash& &>; SizeType = long long unsigned int; int HT_MIN_BUCKETS = 4; size_t = long long unsigned int; spp::sparsehash_internal::sh_hashtable_settings&::key_type = std::pair&]"
sparsepp-master/sparsepp.h:4729:31: required from "size_t spp::sparse_hashtable&::hash(const key_type) const [with Value = std::pair&, int&>; Key = std::pair&; HashFcn = spp::spp_hash& &>; ExtractKey = spp::sparse_hash_map&, int&>::SelectKey; SetKey = spp::sparse_hash_map&, int&>::SetKey; EqualKey = std::equal_to& &>; Alloc = spp::libc_allocator_with_realloc&, int&> &>; size_t = long long unsigned int; spp::sparse_hashtable&::key_type = std::pair&]"
sparsepp-master/sparsepp.h:4242:33: required from "spp::sparse_hashtable&::Position spp::sparse_hashtable&::_find_position(const key_type) const [with Value = std::pair&, int&>; Key = std::pair&; HashFcn = spp::spp_hash& &>; ExtractKey = spp::sparse_hash_map&, int&>::SelectKey; SetKey = spp::sparse_hash_map&, int&>::SetKey; EqualKey = std::equal_to& &>; Alloc = spp::libc_allocator_with_realloc&, int&> &>; spp::sparse_hashtable&::key_type = std::pair&]"
sparsepp-master/sparsepp.h:4401:38: required from "std::pair&::other&>::ne_iterator, bool&> spp::sparse_hashtable&::_insert_noresize(T) [with T = const std::pair&, int&>; Value = std::pair&, int&>; Key = std::pair&; HashFcn = spp::spp_hash& &>; ExtractKey = spp::sparse_hash_map&, int&>::SelectKey; SetKey = spp::sparse_hash_map&, int&>::SetKey; EqualKey = std::equal_to& &>; Alloc = spp::libc_allocator_with_realloc&, int&> &>; typename spp::sparsetable&::other&>::ne_iterator = spp::Two_d_iterator&, int&>, spp::sparsegroup&, int&>, spp::libc_allocator_with_realloc&, int&> &> &>*, std::pair&, int&>*, std::bidirectional_iterator_tag&>]"
sparsepp-master/sparsepp.h:4451:36: required from "std::pair&::other&>::ne_iterator, bool&> spp::sparse_hashtable&::insert(spp::sparse_hashtable&::const_reference) [with Value = std::pair&, int&>; Key = std::pair&; HashFcn = spp::spp_hash& &>; ExtractKey = spp::sparse_hash_map&, int&>::SelectKey; SetKey = spp::sparse_hash_map&, int&>::SetKey; EqualKey = std::equal_to& &>; Alloc = spp::libc_allocator_with_realloc&, int&> &>; typename spp::sparsetable&::other&>::ne_iterator = spp::Two_d_iterator&, int&>, spp::sparsegroup&, int&>, spp::libc_allocator_with_realloc&, int&> &> &>*, std::pair&, int&>*, std::bidirectional_iterator_tag&>; spp::sparse_hashtable&::const_reference = const std::pair&, int&>; spp::sparse_hashtable&::value_type = std::pair&, int&>]"
sparsepp-master/sparsepp.h:5069:77: required from "std::pair&::type, T&>, Key, HashFcn, spp::sparse_hash_map&::SelectKey, spp::sparse_hash_map&::SetKey, EqualKey, Alloc&>::iterator, bool&> spp::sparse_hash_map&::insert(const value_type) [with Key = std::pair&; T = int; HashFcn = spp::spp_hash& &>; EqualKey = std::equal_to& &>; Alloc = spp::libc_allocator_with_realloc&, int&> &>; typename spp::sparse_hashtable&::type, T&>, Key, HashFcn, spp::sparse_hash_map&::SelectKey, spp::sparse_hash_map&::SetKey, EqualKey, Alloc&>::iterator = spp::Two_d_iterator&, int&>, spp::sparsegroup&, int&>, spp::libc_allocator_with_realloc&, int&> &> &>*, std::pair&, int&>*, std::bidirectional_iterator_tag&>; spp::sparse_hash_map&::value_type = std::pair&, int&>]"
main.cpp:6:49: required from here
sparsepp-master/sparsepp.h:943:27: error: use of deleted function "std::hash& &>::hash()"
SPP_HASH_CLASS& hasher;
^~~~~~
In file included from E:/mingw-w64/x86_64-6.3.0-posix-seh-rt_v5-rev2/mingw64/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/bits/basic_string.h:5628:0,
from E:/mingw-w64/x86_64-6.3.0-posix-seh-rt_v5-rev2/mingw64/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/string:52,
from sparsepp-master/sparsepp.h:839,
from main.cpp:2:
E:/mingw-w64/x86_64-6.3.0-posix-seh-rt_v5-rev2/mingw64/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/bits/functional_hash.h:85:12: note: "std::hash& &>::hash()" is implicitly deleted because the default definition would be ill-formed:
struct hash : __hash_enum&<_Tp&>
^~~~
E:/mingw-w64/x86_64-6.3.0-posix-seh-rt_v5-rev2/mingw64/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/bits/functional_hash.h:85:12: error: no matching function for call to "std::__hash_enum&, false&>::__hash_enum()"
E:/mingw-w64/x86_64-6.3.0-posix-seh-rt_v5-rev2/mingw64/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/bits/functional_hash.h:66:7: note: candidate: std::__hash_enum&<_Tp, & &>::__hash_enum(std::__hash_enum&<_Tp, & &>) [with _Tp = std::pair&; bool & = false]
__hash_enum(__hash_enum);
^~~~~~~~~~~
E:/mingw-w64/x86_64-6.3.0-posix-seh-rt_v5-rev2/mingw64/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/bits/functional_hash.h:66:7: note: candidate expects 1 argument, 0 provided
E:/mingw-w64/x86_64-6.3.0-posix-seh-rt_v5-rev2/mingw64/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/bits/functional_hash.h:85:12: error: "std::__hash_enum&<_Tp, & &>::~__hash_enum() [with _Tp = std::pair&; bool & = false]" is private within this context
struct hash : __hash_enum&<_Tp&>
^~~~
E:/mingw-w64/x86_64-6.3.0-posix-seh-rt_v5-rev2/mingw64/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/bits/functional_hash.h:67:7: note: declared private here
~__hash_enum();
^
In file included from main.cpp:2:0:
sparsepp-master/sparsepp.h:943:27: error: use of deleted function "std::hash& &>::~hash()"
SPP_HASH_CLASS& hasher;
^~~~~~
In file included from E:/mingw-w64/x86_64-6.3.0-posix-seh-rt_v5-rev2/mingw64/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/bits/basic_string.h:5628:0,
from E:/mingw-w64/x86_64-6.3.0-posix-seh-rt_v5-rev2/mingw64/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/string:52,
from sparsepp-master/sparsepp.h:839,
from main.cpp:2:
E:/mingw-w64/x86_64-6.3.0-posix-seh-rt_v5-rev2/mingw64/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/bits/functional_hash.h:85:12: note: "std::hash& &>::~hash()" is implicitly deleted because the default definition would be ill-formed:
struct hash : __hash_enum&<_Tp&>
^~~~
E:/mingw-w64/x86_64-6.3.0-posix-seh-rt_v5-rev2/mingw64/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/bits/functional_hash.h:85:12: error: "std::__hash_enum&<_Tp, & &>::~__hash_enum() [with _Tp = std::pair&; bool & = false]" is private within this context
E:/mingw-w64/x86_64-6.3.0-posix-seh-rt_v5-rev2/mingw64/lib/gcc/x86_64-w64-mingw32/6.3.0/include/c++/bits/functional_hash.h:67:7: note: declared private here
~__hash_enum();
^
In file included from main.cpp:2:0:
sparsepp-master/sparsepp.h:944:22: error: no match for call to "(std::hash& &>) (const std::pair&)"
return hasher(__v);
~~~~~~^~~~~

C++:」你叼是吧?你調啊?你調啊?怎麼不調了?剛才不是很跳么?哎我就不明白了,你現在嘴長哪去了?剛才blablablabla不是很能說嘛?你現在倒是說說看程序錯哪裡了啊?「


大概和蒙代爾三角理論類似吧, 運行效率,開發效率和程序員心智負擔這三角不能同時滿足。

想要運行效率高,必須對各種資源有細粒度的把控;

想要開發效率高,就得提供高層次的抽象;

C++為了實現這兩點,那就只能犧牲程序員//和編譯器了。


首先限定一下討論的內容。這裡C++指的是編程語言,不是罩杯,否則沒理由遠離。

如果有人說「珍惜生命,遠離brainfuck」。你一定會問,brainfuck是什麼。你常聽到「珍惜生命,遠離C++」,正是因為

  1. C++用的人多
  2. 知名度高,不用也聽說過

如果是brainfuck那樣幾乎沒人用,知名度很低的,就不會有人勸退了。

順便說一下,用brainfuck寫hello world是這樣的

++++++++++[&>+++++++&>++++++++++&>+++&>+&<&<&<&<-] &>++.&>+.+++++++..+++.&>++.&<&<+++++++++++++++. &>.+++.------.--------.&>+.&>.


別胡說,我們很相愛!

那些不會用CPP的,根本不是真正的程序員。

如果連CPP的特性都不能完全掌握,你還怎麼面試裝逼?

不就是找不到bug,內存需要自己管理嗎?

哪個程序語言寫不出bug?

哪個程序語言不需要管理內存?

自己管理和交給別人管理,當然是自己管理更高效啊!

函數式編程?我們也有啊!

STL難用?你不會用boost嗎!

編譯優化很智能!出現問題那是因為你們這些人不守規矩!

java這麼蠢,python這麼慢,lua?哈哈哈,這種殘次品也敢拿來說事!

CPP11?我們已經CPP17了好嗎!

新特性不會用?那就學啊,程序員不會更新知識還不如回家種田!

你怎麼能不知道編譯器幫你做了什麼?

你這是對自己不負責你知道嗎?出了bug不要找編譯器麻煩,它們都是符合標準的!

上大學的時候沒學好操作系統也敢怪CPP,你蠢你有理?


假如語言是不同的雜貨鋪,那應該是這樣的:


C語言的雜貨鋪:

「老闆,來個鎚子」

「錯誤,沒有找到鎚子」


Java的雜貨鋪:

「老闆,來個鎚子」

「錯誤,在工廠中沒有找到鎚子」


Python的雜貨鋪

「老闆,來個鎚子」

「給你把榔頭,它能做鎚子用」


Haskell的雜貨鋪

「老闆,來個鎚子」

「錯誤,鎚子沒有定義 Sell 實例」


C++的雜貨鋪

「老闆,來個鎚子」

「錯誤,地球是繞著太陽轉的,月亮是繞著地球轉的」


因為有這種人啊

然後他一輩子就廢了


我就轉個圖,看鏈接題圖——

為什麼不再想碰 C++ - 知乎專欄


有精通學習C++的時間和精力,老實研究些業務類的技術運氣好的話可能都能趕上個好公司財務自由了。。。


因為那得看目的和成果
很多人去學c#是為了Windows GUI和Unity,成果挺快就能看見。
很多人去學java是為了Android,成果也挺快就能看見。
很多人去學python,是為了科學計算和爬蟲,成果也挺快就能看見。
很多人去學php,是為了網站後端,成果也挺快就能看見。
很多人去學javascript,是為了網頁前端,成果也挺快就能看見。
很多人學c++,是為了______________

說起來,「除了黑框框我還能幹什麼」之類的問題,似乎只有c/c++的話題下面能看見呢

總感覺還是有點被會錯意思了。。。
很多學c++的不知道快速開發的框架和庫,包括學校開課也是,c/c++的一般都只有語言基礎,其他語言的課多少都帶點項目實戰,c/c++課的項目作業就是黑框框學生管理系統之類的吧,然後才會出現諸如「除了黑框框還能做什麼」之類的問題,而且很多人乾脆也不推薦走c++的路線了,說你有c++的基礎學xxxxxxx很快的,想做遊戲?學unity+c#啊,有c++基礎學習很快的之類的云云,更造成了c++比別的語言學習做東西出來會比別人慢幾十倍的感覺
總的來說就是別的語言可能是帶著目的去學的,但是很多學c++的可能沒有。

很多人提到acm oi之類的,大家看看標題啊,其實不懂演算法的人看起來就更勸退了,搞了那麼久還黑框框打轉來打轉去
外帶我同學朋友圈發的他們學校通知的截圖

我也玩qt,也玩演算法,所以我認為c++並沒有那麼糟,可是他們呢?


魔羯表示不服


如果沒有模版,c++會好用100倍。

但是,c++的精髓之一裡面,就有模版……

其實應該說,如果c++的那些技巧,不用模版就可以實現的話……

那麼c++大概就剩下沒有code routine,module以及通用標準網路庫這些毛病了

---------------------------------------------------

我一直說懶人是社會進步的原動力,

因為絕大多數新技術的推動,第一要考慮的就是:為了讓用戶感覺到方便好用。

絕大多數的語言也是一樣,無論是js對於各種規範的制定,golang對於語法的簡化,還是python的簡單和多樣性的庫的支持,其發展的目標就是越來越簡單越來越好用。

然而……

只有c++……

它的目標是:我會更加強大。

這才是我等搞c++出身的懶人,也開始嫌棄c++的原因啊……

特么老子的時間比公司買硬體的錢重要多了

特么老子的時間比公司買硬體的錢重要多了

特么老子的時間比公司買硬體的錢重要多了


我剛開始學得時候就經常疑問:我特么天天除了debug出來個黑框還能幹啥?

正反饋太少,語法太多,靈活運用估計得兩三年以後了,還不一定包括最新的語法。

還有一部分人連STL都沒有掌握就喊著說c++好麻煩啊,然後就放棄了,實際上STL才應該是用的最熟的。

還有一部分原因就是編譯器的原因,還得看編譯器支持情況,尤其是教學用的vc6.0,坑了一大部分人,所以學校直接上linux教編程挺好的,足夠給學生講明白預處理-編譯-彙編-鏈接的過程。

還有c++11/17的各種語法,新的語法糖也是為了解決特定問題的,亂用的話也會出現亂七八糟的問題,比如上次跟輪子在weibo討論shared_ptr為啥在google禁用的問題

模板,容易走火入魔。

珍愛生命,遠離模板。。。


其實我是過來反對輪子哥 @vczh
正確的搜索方法應該是這樣的

O(∩_∩)O哈哈~


因為C++太過龐大,難以掌握……
(握草我說的真不是罩杯……
@vczh 呼叫輪子哥


我認為,在編程史上,gc(垃圾自動回收機制)的出現絕對是一件大事。
在C++以前的語言,內存對象的銷毀都是由程序員自己控制的。
在C++以後的語言,比如C#,java,python,都有gc機制。使用這些語言編程,內存對象可以創建,但是什麼時候銷毀就變成了一件程序員完全不能控制的事情。是由gc完成的。但是其實一個代碼寫出來,只有程序員自己最清楚什麼時候最該銷毀內存,而gc的銷毀內存時間一般是晚於前者的。這也就導致在內存佔用方面,無gc的語言,其程序運行效率高於有gc的語言。這裡我再舉一個例子吧:
由於特殊的業務需求,我們必須用台式機處理一塊4G大的數據,但是我們運行這個程序的台式機總共內存大小,就只有4G。。。考慮到計算機本身要佔用一定的內存,因此,你如果一次性讀取他們,肯定會把內存擠爆導致程序無響應。
因此比較明智的做法就是:先讀取一部分,處理掉。處理結束以後,把這塊內存銷毀,騰出地方來。再去讀下一塊。比如我們可以先讀2G,處理完以後銷毀掉,再讀取2G。
依照上述方法我們可以連續處理幾十幾百G的數據也沒問題。
不好意思,對於有gc的語言來說,內存的銷毀程序員完全沒法控制,而且什麼時候gc自動把垃圾回收也是不確定的。即便是相同的數據,gc運行的時間也可能不一樣。即:在上述情況下,有可能會出現內存擠爆卻沒有銷毀垃圾的情況。
C++可以直接銷毀內存,這就是C++強大的地方,也是他辣雞的地方:
內存銷毀這個操作,是工作量很大且很容易出亂子的。這也就導致大量的C++程序員在寫代碼的時候,被內存銷毀搞得身心俱疲,痛不欲生。也因此,後人開發語言的時候,一定要設計gc。寧可犧牲一些「程序運行效率」,也要保證「程序開發效率」。

所以我看待C++,就像一把雙刃劍。在高手手中高效,性能優秀,可以說是大殺四方,暢行無阻。但是在一些道行不足的程序員手裡,莫說上陣殺敵,拿到手裡就先把自己弄得傷痕纍纍了。


那假設我現在在家,準備去城市另一邊的超市採購食物:

彙編的方法是步行過去;
C的做法是騎自行車去;
Java的做法去租車公司簽個正式租車合同租輛車開過去;
Python的做法是滴滴打輛車去;
JS的方法是讓別人幫你去買;
Haskell的方法是用膜法將兩點空間上摺疊到一點;
C++的方法是騎前面裝了三種不同類型龍頭后座捆著五個不同規格輪胎框里裝著半框不同形狀剎車的自行車去,並且身上背著全套personal survival kit……


目前為止大多數優秀的編程語言的演進過程都是以讓programmer更方便,更快捷,更安全地完成任務為目的;但C++的演進是以證明自己的牛逼,證明自己也能以XXX方式干XXX事/沒有幹不了的事為目的……結果就是什麼都有又各種過度抽象……我當然承認C++的強大,不過讓我用還是算了吧,搞標準的那幫人自己玩的開心就好……


脫離項目談語言真的是耍流氓……

有電腦了更新一下:

其實正是因為C++的設計包羅萬象,什麼都能幹,再配合歷史包袱,造成了今天C++幾乎幹不了什麼的局面。

我現在是幾乎不用C++了,編寫嵌入式的時候,用C真的足夠了,除非一些特殊的功能否則用C++很多時候是自找麻煩,因為晶元廠商大多數給的是C的API,用C++還要重新包裝,如果C調用C++更加自找麻煩:函數每一次重載都要重寫函數。

正確的做法是:計算量小的嵌入式設備就用純C,比如Cortex-M系列的開發,計算量大就上Cortex-A之類,或者DSP,專用設備就上FPGA,速度快到你高潮。

至於PC機上的開發就更不要說了,買內存換開發效率絕對是明智之選,很多時候寧可是Python+C也不用C++,底層用C封裝以後直接用C#調用就好。

一個好的C++程序員能寫出效率堪比直接寫彙編的,設計模式良好,可維護性好的程序,可是代價太大了,不是每個人都有這樣的能力,所以那些有GC的語言才能大行其道。


顯然他媽的很複雜。


顯然是因為C++容易才這麼說的。


為了回答這個問題特別上了一下google,跟內容聯繫起來才有說服力,看看排序,越容易越遠離(逃


哈,看到這個問題我真要不請自來。

先說答案:因為,雖然沒有任何直接證據,但是統計結果表明,C++會對程序員的性格造成很嚴重的負面影響啊!

大概2005年前後,我在工作中也用了幾年C++,雖然從讀大學的時候就接觸C++,但是依然會遇到一些疑問(你懂的),然後我就去水木清華BBS的C++版去提問題,體驗了一把C++圈的風氣。

唉,哥們我在這行幹了十幾年,接觸的不同語言不同技術的社區很多,但是不得不說,C++社區的程序員,是性格最差的。在水木清華C++版上應該聚集的是華語圈裡C++水平最高的一群人吧,這群人就是喜歡拉幫結派,喜歡拜神,如果不是熟人,問的問題只要感覺稍微不嚴謹一點,就噴,使勁噴,「這種問題都問?」「先回去看《XXXXX》了再來問」「你到底懂不懂XXXXX?」,噴了半天也不幫人解答,滿屏都是戾氣,當然,字裡行間看得出這些人水平真的有,但是,好好解答問題不行嗎?

別著急噴我C++水平不行所以問弱智問題,哥們我好歹是做過當年Windows Live Safety Scanner的人,自認水平不比大部分C++程序員差(說的是當年,現在早忘了),還好,後來我接觸C++程序員少了,過上了快樂幸福的工程師生活:-)。

而且,別誤會,我不是針對C++程序員的,而是針對C++這種語言的,我要說的是,這種語言用得時間長了,人就容易性情大變,人只是受害者,罪魁禍首是C++語言本身

要是只說一個BBS上風氣如此,也許說明不了問題,但是這麼多年,見過的C++程序員大多都會出現過於較真的性格問題,程序員本身就很較真了,連程序員都覺得過於較真,那該有多較真。

大概在一年前,我又有機會去巨硬公司切磋技藝,一連會了幾個C++程序員,哇,當年那種感覺一下子又回來了,原來這麼多年,這圈子裡的風氣態度並沒有什麼改變啊。不過,他們也告訴我,還有更厲害的,美國佬裡面(可見對人性格的傷害不分國界)還有幾個「語法警察」,堪稱語言原教旨主義者,看你的代碼不是按照C++最新標準語法寫的,就不通過Code Review,說不正(qing)宗(zhen),不讓過!而且,這幾個「語法警察」還頗得領導歡心,我X!

當然,沒有任何證據證明C++真的對程序員性格有負面影響,但是現象說明一切啊,所以我也只能說一下我推測的原因。

首先,學習C++真的是一個很苦的過程。據說當年C++之父說發明C++就是為了提高程序員工資,所以造出這麼一個晦澀難懂的傢伙,我真的相信這個江湖傳言,因為C++真的很難學!不是一般的難學!

難學的結果就是,程序員需要投入巨大的心力去了解這個語言的規則,這過程又耗時又燒腦,真的不容易,沉浸於這些規則之中,兩耳不聞窗外事,換了誰也會改變思維方式,然後,當遇到觀點不合的人,很容易這麼想:MD,我學了這麼久才學得這個竅門,你居然還在這裡胡扯!

而且,使用C++語言的實現功能是對性能要求高的核心功能,而不是面向用戶的功能,面向用戶的語言選擇太多,所以,導致C++程序員工作中往往也不會從用戶角度思考,而純粹從技術角度思考,所謂的「工程師思維」就是這麼養成的,這種思維習慣也容易造成性格在常人看來十分奇怪。

聽我一句話:工程這東西,到最後都是處理人的問題,不是處理技術問題

就是這樣。

我要聲明,本人還是很佩服很尊重C++程序員,因為有些程序還是只能用C++來寫啊,他們默默承受了C++語言帶來的傷害,給人類IT事業做出了貢獻,敬禮!(「語法警察」死一邊去,這個敬禮不是獻給你們的)

對於已經入坑的同行,我也沒什麼可說的,估計你們都會往死了拍我。

對於快入行或者剛入行的小兄弟小姐妹,聽我一句勸,如果你不是真心喜歡C++,但凡有點可能,別干需要用C++的工作,因為,除了工作人生還有很多其他有趣的東西。

如果真的必須要用C++,我建議也要在百忙之中接觸一些別的編程語言,C++就好比太極,高深莫測,玩得好出神入化,但是,千萬別像雷公太極那樣夜郎自大,自以為太極天下第一,和快速使用的散手、巴西柔術這些實戰功夫一對剛,20秒被KO……扯遠了,總之,程序員要多接觸幾門語言,如果一門語言宣布「老子天下第一」,那就要小心了,如果一門語言要消耗掉你幾乎所有的心力,那也要小心了。

謝謝!


推薦閱讀:

我學編程為什麼難?是思維方式不對還是學習方式不對?
Meta Programming 主要解決什麼了問題?
有哪些老程序員都知道對新手很有用的經驗?
為什麼 Go 語言把類型放在後面?
新手關於如何看編程經典書的一些疑惑?

TAG:編程 | C++ |