一位程式設計小白的自述 —— 從小學到現在
現在是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 似乎還一無所知,沒有說技術有多厲害,畢竟我大學裡選的是非計算機專業,學計算機知識靠自學了。我只是懷著這一份熱愛程式設計在堅持,它能帶給我成就感甚至快樂。所以我想在這裡做一些交流,或者分享我的一些知識與技巧也好,經此而已。但是程式設計的路肯定會走到盡頭,不會放棄。
其實還有挺多東西要寫的關於我的經歷,也許我的經歷對你沒有任何幫助,但是不要緊,我只是想在這裡,第一篇部落格,記錄我曾經的回憶。