1. 程式人生 > >一位程式設計小白的自述 —— 從小學到現在

一位程式設計小白的自述 —— 從小學到現在

現在是22:13,此時此刻的我記錄第一次寫的部落格。目前在校讀本科,是一位最最最平凡不過的程式設計小白。

從小學五年級開始,天真懵懂的我就開始勵志成為一位程式設計師。直至現在,誤打誤撞,一學就是十幾年,從開始小學的Visual Basic、易語言,到初中的Pascal、Lua,最後到現在的.net,掉髮的路從沒有放棄,知識也越學越多,頭髮越掉越少。每到一個階段再回想自己的過去,總是這麼的天真可笑。同時我也說不出我對java有什麼怨恨,就感覺我對java並不大敏感。在此文,想簡單的分享一下我的程式設計人生經歷:

初中期間兩位程式設計道路上的啟蒙老師

小學五年級到初一期間,易語言在當時還算是風靡半個球,多半輔助、外掛當時還是從他那邊開發出來的。我用著我老爸的臺式電腦,開始做第一個易語言程式,拖拽元件、編寫程式碼、編譯、完成!到現在的,都能感受到當年我寫易語言那種愉悅、隨意的天真味道,這也就是我為什麼當年取名為 小易 並一直使用到現在的原因,雖然我姓名中不含有 易 字。隨著對易語言的熟悉,我也嘗試著去開發一些小工具、小外掛、小玩意兒,但是工具類軟體偏多。就這樣直至上到初二,我得知我們初中的學校有程式設計隊的存在,但是我不知道怎樣才能進入,我便找到我的電腦老師,徐老師。徐老師是學校程式設計團隊的帶隊老師,經常帶領學生在NOIP等比賽中取得非常好的成績。當年我把我曾經寫過的易語言的軟體給他瀏覽了一遍,他遍認為“這孩子有前途。”,我便進入了學校的程式設計隊。

當年我們是學Pascal,學演算法,懵懂的我並不知道,演算法是一個什麼概念。隨著時間推移,老師教我們回溯、遞迴、分治、貪心很多演算法,但我當時對此毫無靈感,似乎思維跟不上,參加競賽時,老師也經常把我們報名到高中組裡比賽,說初中組的比較簡單,沒必要。但是我每次競賽出來的成績,並不理想,跟其他學徒相比,落後太大,我對此感到疑惑:難道我不是做程式設計師的料?信心幾乎被打落到谷底,猶如一條鹹魚,學了又學了,似乎找不到程式設計的樂趣了。

直至那天,徐老師把我介紹給了另一位老師,鄧老師。鄧老師的出現彷佛就是我程式設計道路上的一個轉折點,換句話是他真正啟蒙了我。他非常看好我,經常帶我去參加各種比賽,各種機器人大賽,創新大賽等,在這些大賽中,也獲得了非常不錯的獎項。鄧老師在我印象裡,他就是軟硬體方面都懂大神,設計出自己的

颶風機器人主機板,他在學校設立了自己的機器人基地、機器人培訓班,專門培訓學生的動手能力和思維能力,似乎學校榮獲機器人培訓特色的名譽,也是因他而來的,同時,省級比賽的專案也有他的存在。直到現在,我也有跟鄧老師保持聯絡,非常感謝鄧老師與徐老師。

重燃我的程式設計興趣

這要從2013年說起,還在的我,無意間發現一款名為 觸動精靈① 的IOS越獄軟體。當年的騰訊手遊剛興起的時候,一款名為 天天愛消除 的遊戲特別火,大家都在攀比分數。隨後我拿著我手中早已越獄的iPhone 4下載起了觸動精靈,第一次使用了別人寫的指令碼,執行!螢幕就猶如附著靈魂般的在操作著遊戲,並且能在短時間內消除很多方塊以至於得分非常的高。當年的我驚呆了,這一波讓手機靈魂附體的操作深深吸引了我,激起了對程式設計更大的興趣。直至現在,我的部分外快收入,都是來源於觸動精靈這個平臺,我非常感謝它。

通過一段時間努力,為觸動精靈做出了一些貢獻(用易語言給觸動寫了一個名為易觸動的IDE)後,成功混入了觸動精靈的內部群。我才發現,大神還是那些大神,我才發現,易語言並不能一直賴著他,總得學習新的東西。從那起,我就下定決心,開始學習新的程式語言。回想起我啟蒙老師說過的話:程式語言其實都是大同小異,只要你會了一種,其他都很快上手。於是我不在觸動內部群混了,出來做實實在在的觸動的指令碼開發者,嘗試一下。

① 觸動精靈(Touch Sprite)就是一款用 Lua 語言為基礎開發的一款模擬手機/平板電腦的模擬操作的指令碼開發軟體。

賺到的第一筆最平凡不過的外快

那是2015年的秋天,通過自學Lua和觸動精靈一些基礎函式和框架後,成功混入了觸動精靈的交易群開始嘗試接單。當年的我賺錢模式就是:私人定製,有償維護。第一個客戶來了!要求開發一款AA司機端自動搶單子的指令碼。由於客戶三年都沒有練習,指令碼也停更了,以下是原始碼:

  1 init("0",0)
  2 luaExitIfCall(true)
  3 Devtype=0
  4 width, height = getScreenSize()
  5 
  6 -------------------------------------------------
  7 
  8 -------------------------------------------------
  9 if width == 640 and height == 1136 then
 10 Devtype=1--iPhone 5, 5S,5C, iPod touch 5
 11 elseif width == 640 and height == 960 then
 12 Devtype=2--iPhone 4,4S, iPod touch 4
 13 elseif width == 320 and height == 480 then
 14 Devtype=3--iPhone 非?高分屏
 15 elseif width == 768 and height == 1024 then
 16 Devtype=4--iPad 1,2, mini 1
 17 elseif width == 1536 and height == 2048 then
 18 Devtype=5--iPad 3,4,5
 19 end
 20 if (Devtype~=1) then
 21     lua_exit();
 22     dialog("不支援此裝置型別",0)
 23 end
 24 ------------------------------------------------
 25 function iscolor(pos,p)
 26     r = math.floor(pos[3]/0x10000)
 27     g = math.floor((pos[3]%0x10000)/0x100)
 28     b = math.floor(pos[3]%0x100)
 29     rr,gg,bb=getColorRGB(pos[1],pos[2]);
 30     if (rr>=r-p)and(rr<=r+p)and(gg>=g-p)and(gg<=g+p)and(bb>=b-p)and(bb<=b+p) then
 31         return true;
 32         else
 33         return false;
 34     end
 35 end
 36 function but(pos)
 37     touchDown(1,pos[1],pos[2])
 38     mSleep(5)
 39     touchUp(1,pos[1],pos[2])
 40 end
 41 function untild(pos,p)
 42     while iscolor(pos,p)==false do
 43     end
 44     but(pos)
 45     but(pos)
 46 end
 47 function typexie(x)
 48     if iscolor(XY[Devtype][x][1],4) and iscolor(XY[Devtype][x][2],4) and iscolor(XY[Devtype][x][3],4) and iscolor(XY[Devtype][x][4],4) then
 49         if x==6 then
 50             if iscolor(XY[Devtype][61][1],4) and iscolor(XY[Devtype][61][2],4) and iscolor(XY[Devtype][61][3],4) and iscolor(XY[Devtype][61][4],4) then
 51                 return true
 52                 else
 53                 return false;
 54             end
 55         end
 56         return true;
 57         else
 58         return false;
 59     end
 60 end
 61 function Split(szFullString, szSeparator)
 62 local nFindStartIndex = 1
 63 local nSplitIndex = 1
 64 local nSplitArray = {}
 65 while true do
 66    local nFindLastIndex = string.find(szFullString, szSeparator, nFindStartIndex)
 67    if not nFindLastIndex then
 68     nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, string.len(szFullString))
 69     break
 70    end
 71    nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, nFindLastIndex - 1)
 72    nFindStartIndex = nFindLastIndex + string.len(szSeparator)
 73    nSplitIndex = nSplitIndex + 1
 74 end
 75 return nSplitArray
 76 end
 77 --------------------------------------------------
 78 UI = [[
 79 {
 80   "style": "default",
 81   "width": ]]..width..[[,
 82   "height": ]]..height..[[,
 83   "config": "AA_Driver.dat",
 84   "timer": 60,
 85   "cancelname": "取消", 
 86   "okname": "開始接單",
 87   "views": [
 88     {
 89       "type": "Label",
 90       "text": "AA司機端自動搶單",
 91       "size": 25,
 92       "align": "center",
 93       "color": "0,0,255"
 94     },
 95     {
 96       "type": "Label",
 97       "text": "接單型別",
 98       "size": 15,
 99       "align": "left",
100       "color": "0,0,0"
101     },
102     {
103       "type": "CheckBoxGroup",
104       "list": "豪華型,舒適型,經濟型",
105       "select": "[email protected]@2"
106     },
107     {
108       "type": "Label",
109       "text": "訂單型別",
110       "size": 15,
111       "align": "left",
112       "color": "0,0,0"
113     },
114     {
115       "type": "CheckBoxGroup",
116       "list": "攜程北京接機,攜程北京送機,北京接機服務,北京送機服務,北京半日租,北京日租,分級訂單",
117       "select": "[email protected]@[email protected]"
118     },
119     {
120       "type": "Label",
121       "text": "其他設定",
122       "size": 15,
123       "align": "left",
124       "color": "0,0,0"
125     },
126     {
127       "type": "CheckBoxGroup",
128       "list": "自動拒絕不符合訂單",
129       "select": "0"
130     },
131     {
132       "type": "Label",
133       "text": "目前訂單型別只有以上五種選擇,沒選中的訂單或其他型別訂單,均不接單",
134       "size": 15,
135       "align": "left",
136       "color": "255,0,0"
137     },
138     {
139       "type": "Label",
140       "text": "注意:執行指令碼過程中,不可開啟其他應用!",
141       "size": 15,
142       "align": "center",
143       "color": "0,255,0"
144     }
145   ]
146 }
147 ]]
148 ret,choicetype,choicexie,choicequxiao= showUI(UI);
149 if ret==0 then
150     lua_exit()
151 end
152 --------------------------------------------------
153 XY={}
154 XY[1]={}
155 XY[1]['type']={}
156 XY[1]['type'][2]={
157     {  496,  196, 0x8bc21c},
158     {  523,  202, 0x8fc324},
159     {  532,  219, 0xc1de85},
160 }
161 XY[1]['type'][1]={
162     {  496,  196, 0xebf4d8},
163     {  523,  202, 0xffffff},
164     {  532,  219, 0xa2ce4a},
165 }
166 XY[1]['type'][0]={
167     {  496,  196, 0xa8d155},
168     {  523,  202, 0x9bc93c},
169     {  532,  219, 0xffffff},
170 }
171 XY[1]['']={  373, 1025, 0x7eba03 }
172 XY[1]['放棄訂單']={  127, 1087, 0x192638 }
173 XY[1]['確認放棄']={  454,  655, 0xffffff }
174 XY[1]['標識']={       553,  195, 0xcbe49a   }
175 XY[1]['特殊返回']={     86,   77, 0x7eba03  }
176 XY[1]['返回']={      44,   81, 0xfefefe  }
177 XY[1]['新訂單']={    241, 1054, 0x7eba03   }
178 
179 
180 
181 
182 XY[1][0]={      --攜程北京接機
183     {  129,  192, 0x9a9a9a},
184     {  205,  194, 0xe2e2e2},
185     {  296,  193, 0xd5d5d5},
186     {  326,  184, 0xbebebe},
187 }
188 XY[1][1]={      --攜程北京送機
189     {  129,  192, 0x9a9a9a},
190     {  205,  194, 0xe2e2e2},
191     {  296,  184, 0xc8c8c8},
192     {  326,  184, 0xbebebe},
193 }
194 XY[1][2]={    --北京接機服務
195     {  129,  194, 0xe2e2e2},
196     {  177,  208, 0xd2d2d2},
197     {  212,  199, 0xd8d8d8},
198     {  235,  218, 0xbfbfbf},
199 }
200 XY[1][3]={     --北京送機服務
201     {  129,  194, 0xe2e2e2},
202     {  177,  208, 0xd2d2d2},
203     {  218,  202, 0xdcdcdc},
204     {  230,  214, 0xbdbdbd},
205 }
206 XY[1][4]={    --北京半日租
207     {  129,  194, 0xe2e2e2},
208     {  211,  193, 0xc5c5c5},
209     {  232,  205, 0xeaeaea},
210     {  281,  191, 0xd7d7d7},
211 }
212 XY[1][5]={    --北京日租
213     {  129,  194, 0xe2e2e2},
214     {  209,  189, 0x888888},
215     {  253,  201, 0x999999},
216     {  175,  199, 0xadadad},
217 }
218 XY[1][6]={    --分級訂單
219     {  139,  185, 0x686868},
220     {  185,  200, 0xa1a1a1},
221     {  229,  187, 0xdadada},
222     {  266,  188, 0xafafaf},
223 }
224 XY[1][61]={    --分級訂單
225     {  139,  185, 0x686868},
226     {  185,  200, 0xa1a1a1},
227     {  229,  187, 0xdadada},
228     {  266,  188, 0xafafaf},
229 }
230 XY[1][61]={    --分級訂單驗證
231     {  132,  371, 0xe3e3e3},
232     {  252,  369, 0xc3c3c3},
233     {  356,  373, 0xbbbbbb},
234     {  459,  390, 0xbebebe},
235 }
236 -------------------------------------------------
237 function checktype()
238     local p
239     xtype = Split(choicetype,"@")
240     for x=1,#xtype do
241         p=true
242         for i=1,3 do
243             if iscolor(XY[Devtype]['type'][tonumber(xtype[x])][i],3)==false then
244                 p=false
245                 break
246             end
247         end
248         if p then
249             return true;
250         end
251     end
252     return false;
253 end
254 function checkxie()
255     local p
256     xxie = Split(choicexie,"@")
257     for x=1,#xxie do
258         if typexie(tonumber(xxie[x])) then
259             return true;
260         end
261     end
262     return false;
263 end
264 
265 while (true) do
266     if iscolor(XY[Devtype]['標識'],5) and iscolor(XY[Devtype]['新訂單'],5) then
267         ptype = checktype()
268         pxie = checkxie()
269         but(XY[Devtype]['標識'])
270         while iscolor(XY[Devtype][''],3)==false do
271             but(XY[Devtype]['標識'])
272         end
273         if ptype and pxie then
274             but(XY[Devtype][''])
275             while iscolor(XY[Devtype][''],3) do
276                 but(XY[Devtype][''])
277             end
278             else
279             if choicequxiao == "0" then
280                 but(XY[Devtype]['放棄訂單'])
281                 mSleep(10)
282                 but(XY[Devtype]['確認放棄'])
283                 mSleep(500)
284                 while iscolor(XY[Devtype][''],3) do
285                     but(XY[Devtype]['返回'])
286                 end
287             end
288         end
289     end
290     if iscolor(XY[Devtype]['特殊返回'],5) then
291         but(XY[Devtype]['特殊返回'])
292     end
293 end
檢視程式碼

這個指令碼,讓我有了第一筆收入,成就感也爆棚,也許我還小,當年的我開心的跟花兒一樣….

逐步嘗試去了解新事物 —— .NET

因為中考發揮一般,進了一個我們市裡比較中上的高中,但是這所高中特色他主打的並不是軟體程式設計方面的,而是做與飛行器有關,比如做飛機模型等。這並不是我喜歡的型別,所以我並沒有加入到那邊的培訓中。在寒暑假時間,我便繼續利用觸動精靈去找我一些外快,在高中學習期間,幾乎都這麼過了,除了學習還是學習。

高一期間,我又一次偶然的機會,瞭解到了C#,它的程式設計方式和程式設計語法深深吸引了我,很優雅。因為在此之前,我是使用過 java 開發Android應用一段時間(時間問題,不在這裡詳細描述了),相比與 Java,C#的確大大的提高了程式設計的效率。我第一次瞭解到了WinForms,因為當年還沒認識到網際網路的強大(很懵懂),所以沒有去搞 web 開發。在那期間,我跟桌面應用相依為命,高中就這樣了。

直至到了大學,發現了大學裡有一個比較嚴重的問題,學校素拓分數管理的那方面非常的不人性化,人工填寫、人工打表、人工稽核、人工蓋章,這一些操作讓我覺得不是那麼的與現代接軌,現在都是主打無紙化、簡潔化、便捷化,我就產生了做一個素拓管理的一套系統,但是整套系統的客戶端是基於WinForms,歷經幾個月,最最最雛形的東西做出來給大學的老師看了一眼,馬上得知,這套系統用 WinForms 開發其實弊端很多,首先不能相容每個使用者的使用最為致命,比如需要安裝 .net framework,比如不能跨作業系統使用等問題。慢慢的我去了解 Web開發。

現在

現在….我其實就是一個程式設計小白,可以這麼說:我對 .NET 似乎還一無所知,沒有說技術有多厲害,畢竟我大學裡選的是非計算機專業,學計算機知識靠自學了。我只是懷著這一份熱愛程式設計在堅持,它能帶給我成就感甚至快樂。所以我想在這裡做一些交流,或者分享我的一些知識與技巧也好,經此而已。但是程式設計的路肯定會走到盡頭,不會放棄。

其實還有挺多東西要寫的關於我的經歷,也許我的經歷對你沒有任何幫助,但是不要緊,我只是想在這裡,第一篇部落格,記錄我曾經的回憶。