學習程序語言也會像學外語一樣會受到母語(第一語言)的影響嗎?

最初學習的程序語言(如C)的語法等會對程序員的思路以及未來的編程的風格產生什麼想的影響?

歡迎修改提問,讓提問更易理解,謝謝


為什麼大家都在談具體的語法呢?具體的語法其實並不重要啊。重要的是編程範式(paradigm)對人的思維的影響。

我當時就一度很不喜歡 OO,於是寫出的 C++ 最多停留在 ADT 的級別;寫 PHP 的時候也不用任何 OO 特性。而同時,以 Java 入門的同學就非常地習慣 OO 了(這是可想而知的嘛)。

更不要說以 LISP 入門的人了(難道是老 6.001 出來的?);函數式編程的範式確實會有種優雅、上檔次的感覺,而大多數以 C 一類的語言入門的人都不會願意接受。(我從前的室友就表示他實在無法欣賞 functional programming;另一個同學也對 Scheme 淺嘗輒止,回去埋頭寫彙編了。)


應該不會。。。如果都是淺嘗輒止那可能會搞混。但要是幾種語言都是常常要用的,很快就區分不出哪種先學哪種後學了。。。


我的母語言是javascript,現在學習golang.javascript為了提高瀏覽器的解析與效率是需要加分號的,但是golang中並不需要,如果寫了還會報錯;

var pos_cfg = {};
pos_cfg._this = _this;
pos_cfg.cfg = cfg;
pos_cfg.src = pop;
pos_cfg.fx = cfg.pos;

_this.on(cfg.trigger,pos_cfg,function(ev){
ev.data.src.show();

ev.data.screenWidth =$(window).width();
ev.data.screenHeight = $(window).height();
ev.data.scrolltop = $(document).scrollTop();
ev.data.top = _this.offset().top;
ev.data.left = _this.offset().left;
ev.data.height = _this.height();
ev.data.width = _this.width();
switch (ev.data.fx)
{
case "bottom_right":
pop.css({
left:ev.data.left+ev.data.width-ev.data.src.width()+ "px",
top:ev.data.height + ev.data.top + 5 + "px"
});
break;
case "bottom_left":
pop.css({
left:ev.data.left+ "px",
top:ev.data.height + ev.data.top + 5 + "px"
});
break;
case "top":
pop.css({
left:ev.data.left + "px",
top:ev.data.top-ev.data.src.height() + "px"
});
break;
case "left":
pop.css({
left:ev.data.left-ev.data.src.width() + "px",
top:ev.data.top + "px"
});
break;
case "right":
pop.css({
left:ev.data.left + ev.data.width + 1 +"px",
top:ev.data.top + "px"
});
break;
case "zs":
pop.css({
left:0+"px",
top:parseInt(ev.data.scrolltop)+"px"
});
break;
case "zx":
pop.css({
left:0+"px",
top:ev.data.screenHeight-parseInt(ev.data.src.height()) +parseInt(ev.data.scrolltop)+"px"
});
break;
case "ys":
pop.css({
left:ev.data.screenWidth-parseInt(ev.data.src.width())+"px",
top:parseInt(ev.data.scrolltop)+"px"
});
break;
case "yx":
pop.css({
left:ev.data.screenWidth-parseInt(ev.data.src.width())+"px",
top:ev.data.screenHeight-parseInt(ev.data.src.height()) + parseInt(ev.data.scrolltop)+"px"
});
break;
default :
pop.css({
left:ev.data.left+ "px",
top:ev.data.top+ev.data.height + "px"
});
break;
}
});

上面是寫的js;

下面是golang的一段代碼

func create(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/plain; charset=utf-8")

r.ParseForm()
if len(r.Form["user"][0]) &< 6 || len(r.Form["pwd"][0]) &< 6 { fmt.Fprintf(w, `{"created":false,"errno":1}`) return } user := r.Form["user"][0] pwd := r.Form["pwd"][0] name := r.Form["name"][0] email := r.Form["email"][0] db := ctx.GetDb() rows, err := db.Query(` INSERT INTO users (username,name,pwd,email) VALUES ($1,$2,md5($3),$4) RETURNING username `, user, name, pwd, email) if err != nil { fmt.Fprintf(w, `{"created":false,"errno":2}`) return } if rows.Next() { fmt.Fprintf(w, `{"created":true,"errno":0}`) } else { fmt.Fprintf(w, `{"created":false,"errno":3}`) return } }

開始寫的時候是很痛苦的,但是慢慢的就習慣了。


個人表示沒發現有影響…… 我第一門語言是C,C語言嘛我的感覺就是一動手就開始數長度,數位元組長度啊位長度啊什麼的。但是到了學寫Java時候,這些影響完全消失了,一點都沒剩下。我還經常寫SQL,那是連大括弧都不用了,C語言風格都沒留下來。


顯然是會的。我以前教過一個學生,先學指針,然後跳過所有C語言的技巧,直接從C++的非C部分開始,結合以前指針的知識來寫,效果拔群。等積累了足夠多的計算機科學的知識之後,再去看那些語言的基礎部分的技巧,瞬間就學會了。

所以說,不能從一開始就搞那些跟OS和底層結合得太緊密的那些東西,特別是C語言就很容易讓人這樣。


如果只是語法層面來說的話,新手的確很容易混。舉我自己的例子:我先學的 Pascal,然後學 VB6 的時候就習慣性地行末分號、賦值用":="、變數定義一律寫到函數頂部。再然後學 C 的時候就習慣性行末不加分號,函數定義前面寫個 "Sub"。再然後學 JavaScript 就偶爾加分號偶爾不加分號寫得一片混亂。再再然後學 Python2 的時候……Print 後面習慣性地加括弧。最後學 Python3 的時候 Print 後面死也不帶括弧了。再然後學 Bash Shell,賦值語句的等號兩側習慣性加空格。我就不說 PHP 這種反人類的 Magic 引號的設計了。

但是,學熟練以後,這些問題都不是問題。我想講的,是語法對編程思路的影響。

比如說 Pascal,這東西就是個純用來實現演算法的語言,只適合做演算法做 OI。Pascal 出來的人一般數學都好。當然我小學時候也嘗試過用 Pascal 實現高級功能比如說輸出 GB2312 字元串,各種 Dirty Hack,最後成功了。後來想封裝成庫,可惜一堆 Bug 最後不想改了;但是簡單的幾個功能想了我好長時間。Pascal 除了做演算法真的啥都幹不了。(OP 不算)

然後說 VB6。VB 的特性就是簡單易用快速開發,代碼寫的多亂都行。所以 VB 出身的都是典型國產小軟體公司程序員。做出來的東西都是 Common Controls 堆砌起來,慘不忍睹的界面設計,將就能用的功能,毫無用戶體驗,也就給企業內部用用。

C 語言:這東西太底層。學到一定程度,數組什麼都沒用了,都要自己 malloc,各種指針。所以 C 高手都有全局意識和統籌規劃能力。不然一不小心就溢出了。

Python:我很喜歡把一些數學概念引入程序的想法。比如迭代器,.__iter__() 裡面寫的東西相當於數學裡面對一個數列遞推公式的描述。Python 出身的人數學思想和邏輯體系都很完善。

……

編程語言的風格往往會決定一個人的慣常思考方式,而第一語言往往對人有很大影響。


話說我學了兩門外語,英語和日語、可能是我母語學的不好吧,沒感覺這兩門收到母語影響,這兩門之間也沒互相影響。

關於編程,如果一直做面向對象開發,使用面向對象語言,其實影響不大,市面上常見的面向對象語言都是C類語法,就是和C語言語法類似,至於面向對象的思維簡歷起來以後語法完全不是障礙,也不大會收到影響,不過如果專去做如面向函數或者其他類型開發就會收到很大的影響


據說一個寫多了就不會寫別個了.........


語法這個東西,寫的多了,它就定格在那兒了,不要過於糾結這個!


我覺得更主要的看常用的語言吧,比如同一個問題

我的答案:IP地址段表示方法批量轉換的方法或工具有哪些?

@波斯基 老師的答案:IP地址段表示方法批量轉換的方法或工具有哪些?

很明顯看出我由於長期使用perl,解題都是字元串處理的思路。而波斯基老師使用C,馬上就發現用位操作來處理更為簡單明了。


推薦閱讀:

為什麼代碼注釋中有@符號?
JDK 1.8.0_92 Arrays.sort()方法不可用?
程序編碼都是外文的,什麼時候出中文啊,我有生之年能否看到!!!?
居然跟老師爭論如何畫UML類圖,我覺得我的沒錯,請大神進來評評理,我該怎麼辦?
在《數碼寶貝》中,光子郎用什麼語言寫代碼?

TAG:程序員 | 編程語言 | 編程 | 計算機 |