小猪的博客

学期感想和总结

又是一个学期过去了,我在软件工程这条路上又迈出一步,这只是写给自己的,对自己这一学期的总结罢了。

最后的PHP?

学期初,最开始便是做的一个基于ThinkPHP的毕业生投票网站,也做了一个简单的微信和手机Web版本。

嘛,关于PHP我还是比较冷静的,PHP适用于传统中等业务逻辑和低并发要求的Web应用。

毕竟没有太多时间,我和另一个同学就直接用了ThinkPHP这种简单无脑框架(当然,还理所应当的踩了坑,这些细节就不说了)


所谓国人自己的框架——ThinkPHP

最后嘛,我基本上只是做了5天就转战别的东西了,留下队友暴力撸前端…最后也没多少钱分,主要就是又熟悉了一下框架,知道了一点SMTP协议的东西和关于数据库事务的设计和使用(毕竟投票需要多次SQL,安全、事务和回滚是非常重要的)。

入坑iOS开发

对于我这种从来不能静下心来的人,完成了上个Web项目之后,由于加入了学校的先声网,于是我就又有活干了……先声网是我们学校的一个提供各种校园在线服务的组织,一个技术至上的团队(技术栈包括了Java,PHP,C++,Android开发,iOS开发,Web安全等,也承办各种程序设计大赛,短码比赛之类的活动)。当然,作为我这种菜鸟进去的时候前辈已经积累下了很多经验,而我主要最后就加入了iOS开发。

我们最早的iOS客户端-先声,是由学长开发的,而那名学长最后也转向别的方向,所以我主要就是在此之上二次开发的。对于我这种从前对iOS开发一无所知的新手,看到Objective-C所谓的:

1
2
3
4
5
6
7
8
NSLog(@"%@",@"fuck");
@property
@interface
#ifndef
#endif
compare(nil, Nil, NULL, NSNull);
compare(0, 1, YES, NO);
Fuck *fuckPointer = [[Fuck alloc] init];

“优雅”语法,我发现我实在难以平静下心来写,于是就直接上手了Swift来重构整个项目。 学习的过程其实是挺愉快的,最开始当然就是看《The Swift Programming Language》中英配合,大概也就2天时间。Swift的语法真是爱不释手,比如你可以这么写for-in 循环

1
2
3
4
5
for i in 1...101{
if(i % 2) == 1{
println(i)
}
}

由于Swift支持FP,你甚至可以这么简写闭包函数,与lambda表达式无异

1
2
3
4
5
//little calculator
knownOps["+"] = Op.BinaryOperation("+"){ $0 + $1 }
knownOps["-"] = Op.BinaryOperation("-"){ $1 - $0 }
knownOps["*"] = Op.BinaryOperation("*"){ $0 * $1 }
knownOps["/"] = Op.BinaryOperation("/"){ ($0 != 0) ? $1 / $0 : nil }

虽然Swift 2.0之前,没有异常处理(全靠assert,或者optional处理……),不能有static成员(可以自己构造一个计算属性,里面存一个static变量……),可选链经常容易写错……等等各种小问题,但是有各种方法和框架来解决,并且随着如今Swift 2.0已经发布,这些问题都将不会再困扰初学者……

之后,幸好找到了Stanford的CS193P课程,那个课程老师讲的非常详细,代码写的也是非常顺……(live code),由于紧接着就是五一,所以直接连着看了3天……现在回想起来真是一个悲惨的时光……

从最开始ViewController的生命周期,delegate,消息,UIKit,TableView,Autolayout……一系列以前从未仔细考虑过的东西慢慢的理解。其中对我感触最大的,就是multi-MVC模式,以前对MVC的理解大概只停留在view层分离UI层,controller控制数据流,从模型层拿,而model直接面向数据库或者数据生成……而multi-MVC更上了一层,每个MVC都可以以其它MVC为model,从而使得整体的模型复用程度提升,而又不会导致过高的耦合。消息机制和代理模式的实际使用也让我对GUI编程可能有了更多的理解(只是GUI编程而不是GUI哦,我现在还是很讨厌做UI或者前端……)

总之,技能的培养这样慢慢起来了,原来看起来那样离我很遥远的iOS开发,渐渐的我也可以稍微接触了。当然,我也许不能当一个iOS开发者吧,毕竟所有的UI都是靠XIB拖控件以及使用Autolayout和Size Classes做出来的,并没有一丝代码控制……(实际上我并不会),这在大型项目中是不可能的。或许我只适合写逻辑或者模型层吧。Anyway,我最后还是花了大概1周时间把整个项目重构,iOS客户端就变成了如今的样子……API封装成一个可动态修改的模式,所有类型转换都采用optional控制,也是基本达到了最后的要求……

虽然也许我今后可能不会真正入坑iOS开发,但是GUI编程来说,Cocoa Touch框架以及Swift确实让我感受到了一种编程的乐趣以及这种高效率的爽快(对比Android SDK来说……有点可怕的Activity和Fragment很难让我有这种感觉)。

再战JavaScript-Node.js

或许是这种二流学校的命吧,我们有一个叫做“SRTP”-课外研学学分的东西,所以,我被迫(也是无奈)选择了一个SRTP项目做。由于我点偏了技能点导致Web后端知识比较多,我们选择了一个实时协作编辑系统作为项目要求,当然,最开始的目标就是做成Google Docs那种可以同时看到多个人编辑的位置。 当时Node.js非常火,而且具有事件驱动和非阻塞IO两大特点,感觉上非常适合这个情景。于是我就再次面对了JavaScript这门比较奇葩的语言。


我们的目标

如今许多前端工程师都想凭借Node.js深入后端领域,达到所谓大前端或者全栈的理想境界,但实际上,Node.js对新手极不友好…… 首先,由于非阻塞的IO,各种事件,包括数据库读写,文件读写都是异步的,由事件轮询来处理,看起来先后顺序依次的a(),b(),c()三个函数,实际执行顺序完全可能是c()->b()->a()。

为了强行让他们按照顺序执行,聪明的你可能会使用回调写法,但是很快就会面对最可怕的callback hell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function validate() {
log("Wait for it ...");
// Sequence of four Long-running async activities
setTimeout(function () {
log('result first');
setTimeout(function () {
log('result second');
setTimeout(function () {
log('result third');
setTimeout(function () {
log('result fourth')
}, 1000);
}, 1000);
}, 1000);
}, 1000);
};
validate();

由于人类写代码都是竖直向下的,如此横向发展绝对不是一个好事情。当然,我们现如今也有各种解决方案,包括依旧是回调的高级语法糖async,全部使用事件处理的EventEmitter,同步思维写异步的promise,都是不错的解决方法……

Node.js有很多槽点(以至于我不想展开写),但是我基本配合着《Node.js权威指南》,外加网上各种教程,GitHub各种开源轮子,把我们的项目做起来了。说是项目,其实更是一个实验新技术的体验,我们整个技术中,有核心的Node.js,Redis,Mongodb,有我以前从未使用过的Mongoose(ORM框架),而且由于Node.js的纯粹性,对HTTP协议认识(比如手动实现multipart/form-data),Session手动处理,非关系性数据的组织,路由控制,RESTful API设计都有了一些认识,也许是不幸中的万幸吧……

奇怪的技能点

当然,我现在承认我就是一个容易三心二意的人,在这一学期中,我又开始点奇怪的技能点了。

最早是括号神教的Lisp(这也是我为什么喜欢Swift的原因,FP自然有它的优势,高阶逻辑写起来是非常爽的一件事)

接下来还有蟒蛇大法Python,也许挺惭愧,大一真的只学过C++的我,一直对Python就是只会Hello world,如今也是真正花了一周入门Python 2(很抱歉不是3……),Python对我的感觉就是非常精简,动态,类似于Ruby的体验(我并未深入过Ruby,不过还是见识一些简单的语法的),以及FP的支持,(lambda),有各种非常好用的库来简化所有开发,你想做什么基本都可以在Python中找到,怪不得Stanford如今采用Python作为CS新生的入门课程……

最后,我也得安利一下微软,C#相比于Java的优势,不是在你看书和Java对比的时候,而是当你写下第一行C#时才会发现……(抱歉又黑了Java),无论是非常丰富的关键字,还是在语法层面提供的委托方法(而不是Java的设计模式撑起的东西),也有灵巧的asynclineq,都会让你眼前一亮。当然,虽然C#已开源,但是跨平台还并不可信,想要靠这个吃饭,还是得跟着微软帝国干。当然,现如今搞游戏用Unity开发也是不错的前景,你看仙剑六,啊不,比如最近我喜欢玩的一个音乐游戏(MUSYNC),无论是画面还是游戏性都是非常之棒,而Java阵营在游戏的表现或许只有那个代码不堪入目的Minecraft吧……

总结

也许扯了很长时间,不过反正这也是给自己看的。如果说大一一学期我是完全迷惘地度过,那么大二上我第一次觉得自己能做些什么,大二下我便认为自己能有资格说可以做什么。或许在编程这方面,我已经接触过多,接触过浅,正如我“装作什么都懂的……xx菜鸟,xx菜鸟……”知乎签名一样,我到现在并没有下定决心要去做某个领域的开发,或者其他之类,但是我也许大概了解了这些领域是在干什么,或许在今后的选择中不会茫然无措。

大二终将结束,如此迷茫的我,或许终于找到了一点点前进的方向了吧。