一名技术人员的能力高低,不仅仅在于编程,更多的是一种思维,越接触上层的技术与底层的原理,越是如此。当然,作为我们现在所处的位置,肯定要踏踏实实地撸代码,不要去过多思考高屋建瓴的东西。熟能生巧,手感热了,思维自然慢慢地成熟起来。到后面,语言仅仅只是一门工具。
从一个Web站点说起
书的作者自己编写了一个分享学习编程和设计资源的小网站——技匠社(jijiangshe.com)
我觉得这个网站本身就很不错,提供的资源也有益于个人学习交流。
那么这个网站是如何开发出来的呢?不同架构师肯定都有不一样的方案,正如一千个人眼中有一千个哈姆莱特。但是,无论使用何种技术,以下几个基本流程是不会变的。
-
网站定位与功能设定
1.1 你希望的你网站做什么?
网站或者App无论大小,首先应该非常明确这一点。面对的人群是谁,需要给他们带来什么他们所需要的服务。举一个例子,我和朋友即将上线的App “果核”是一款面向本校大学生的校园学习生活服务类应用。
1.2 希望设定哪些功能?
围绕“校园学习生活服务”这个核心,我们分了几个板块:校园应用(课表/绩点/馆藏/俱乐部/校车/空教室);每日推荐(首页/此刻/彼时/星座/地气);小工具(待办便签/吃啥/分贝计/翻译/查快递等);论坛(开发中);健康管理(开发中) -
信息架构(概要设计/业务建模)
这个难度就比较高了,需要一定的经验与思维力度,对不同纬度和粒度的信息进行抽象,规划,设计,从而支撑起整个网站的信息体系。这就是架构师干的活,如果达到了这个阶段,已经步入高手的行列了。
"我经历过很多不同的信息架构方法论,从最初基于模块的设计,到后来的领域驱动设计(DDD),面向服务的设计(SOA),Oracle的基于数据建模驱动的设计,再到最新的微服务架构设计,等等。我想说,这些方法论大多是针对那些大规模应用而言的,你需要了解他们,并有意识地在你的系统设计中去匹配这些优秀的架构和设计思想,这有利于你做出拓展性良好的系统,从而避免了因整个系统复杂度的提升而导致大规模重构的风险。"
对照技匠社这个网站来看,需要定义三个实体类:User(用户),Resource(资源),Feedback(反馈)。
围绕这三个模块,再定义出三个服务:UserService,ResourceService,FeedbackService。
接着再为这三个服务设计需要用到的方法。
-
UI设计
对于资金充裕的项目,需要由专业设计师来操刀。再不济也需要专业的前端设计和美工,然而很多小型项目,由于没有钱,很多时候甚至由后台程序员来凭感觉画一画(比如“果核”)。所以有空时,学一点设计,或者不需要刻意去学,多去领会一些美,品味自然会提升一些,这在我看来是很有必要的。
实际情况是,很多网站开发都会套用开源的模板,这样可以避免重复造轮子,更为便捷舒适。但是使用模板也有他的缺点,大致分为以下几点:- 毕竟是别人的东西,对其思路不熟悉,在拓展时往往牵一发而动全身。
- 模板包含了大量的对手头项目来说多余的和不必要的东西,这需要我们花时间去小心地剔除。
- 模板本身存在缺陷,需要我们修复。
- 在拓展新界面时,需要考虑和原模板的搭配,再次设计。
-
前端开发
就针对技匠社这个网站而言。
目前最流行的前端框架是AngularJS和React。在这个项目中选择的是AngularJS,有以下两个方面的原因:- 我需要的是一个更完整的JS框架,AngularJS能满足我在全面性方面的要求,可以使用它构建一个完整的Web应用。
- 我希望在将来用Ionic写一个App,由于Ionic也是基于AngularJS的,这意味着,我将来可以复用很多代码。
-
后台开发
SpringBoot:开发基于REST的服务。
MyBatis:提供基于SQL的持久层支持。
Redis:持久化用户的Session信息。
SpringSecurity:提供安全方面的支持。
MySQL:使用传统的关系型数据库。
Maven:项目的包依赖管理,以及项目打包。
Spring Boot并不是Spring的一个升级版本,而是一个为构建微服务提供更好支持的全新框架。他是一个能够提供良好拓展性的框架,在初期可以将所有的功能作为一个整体对外服务,随着用户量的上升和系统规模的不断扩大,可以借助Spring Boot,并基于Domain Driven Design的设计思想将系统的的服务进行拆分,构建出一系列微服务。
-
部署+运维
对于这块这块不是很了解,不过至少需要会用Linux+Tomcat/Jetty+Apache+Nginx
技能树
- 逐渐接触使用命令行
- 在最初学习编程的时候,每一门语言都有集成了编译器的IDE,这些集成开发环境十分方便,往往只要在图形化街面上点击一个按钮,就能完成一系列复杂的操作。这会让人觉得,这是顺理成章的事。而现在的很多工具,都在往简约高效方向发展,有的甚至没有图形化界面。
- 打个比方,就像在玩CS这款游戏的时候,可以调取菜单,然后通过点击按钮来购买装备,这似乎并不繁琐。但是假如你想训练自己的闪光弹投掷技巧,需要购买无限的闪光弹,并在闪光弹投出以及碰撞的时候留下可见的抛物线,那通过菜单点击操作就十分繁琐了,很多玩家往往直接调出控制台,输入指令来完成这些操作。
- 这和使用命令行来控制你的操作系统有异曲同工之处。命令行在一些环境下可以提高工作效率。当然并不支持完全抛弃图形化界面。
"以前,我在启动一套本地的开发环境时,总是需要手工地一个个去单击那些服务,逐一启动web服务器,数据库服务器,打开IDE等等。这看起来每次只需要花费2-3分钟的时间,但这是每天每天都需要进行的操作,而且由于调试需要,一天之内需要重复启动好几次。一个月下来,我光在启动环境的时间就花费了2-3个小时。后来,我便学着写了一个shell脚本,其实非常简单,就是按照顺序去启动服务的命令,这样我只要单击那个脚本,整个环境就搭建好了。因此,我经常鼓励身边的程序员去写自动化脚本,让自己从重复性的工作中解脱出来。"
- 使用Git命令行来进行版本控制
-
代码重构
封存,以后再写。 -
规范代码
- 封装/继承/多态使代码更简洁,可复用率高
- 尽量规范代码的书写,尤其不要使用中文以及尽量不要使用pinyin。
- 常写注释
- 多考虑异常捕获情况
- 等等
暂时就写到这,这本书整体还是不错的,但是还是有点偏鸡汤型,这种类型的书现阶段而言只需读一两本就够了,把握一下方向,更多还是需要去践行。
公众号:果核里的图灵
网友评论