随笔 | 读《写给年轻程序员的思考书》ii

306 阅读7分钟

一名技术人员的能力高低,不仅仅在于编程,更多的是一种思维,越接触上层的技术与底层的原理,越是如此。当然,作为我们现在所处的位置,肯定要踏踏实实地撸代码,不要去过多思考高屋建瓴的东西。熟能生巧,手感热了,思维自然慢慢地成熟起来。到后面,语言仅仅只是一门工具。

从一个Web站点说起

书的作者自己编写了一个分享学习编程和设计资源的小网站——技匠社(jijiangshe.com) 我觉得这个网站本身就很不错,提供的资源也有益于个人学习交流。 那么这个网站是如何开发出来的呢?不同架构师肯定都有不一样的方案,正如一千个人眼中有一千个哈姆莱特。但是,无论使用何种技术,以下几个基本流程是不会变的。

  1. 网站定位与功能设定 1.1 你希望的你网站做什么? 网站或者App无论大小,首先应该非常明确这一点。面对的人群是谁,需要给他们带来什么他们所需要的服务。举一个例子,我和朋友即将上线的App “果核”是一款面向本校大学生的校园学习生活服务类应用。 1.2 希望设定哪些功能? 围绕“校园学习生活服务”这个核心,我们分了几个板块:校园应用(课表/绩点/馆藏/俱乐部/校车/空教室);每日推荐(首页/此刻/彼时/星座/地气);小工具(待办便签/吃啥/分贝计/翻译/查快递等);论坛(开发中);健康管理(开发中)

  2. 信息架构(概要设计/业务建模) 这个难度就比较高了,需要一定的经验与思维力度,对不同纬度和粒度的信息进行抽象,规划,设计,从而支撑起整个网站的信息体系。这就是架构师干的活,如果达到了这个阶段,已经步入高手的行列了。

"我经历过很多不同的信息架构方法论,从最初基于模块的设计,到后来的领域驱动设计(DDD),面向服务的设计(SOA),Oracle的基于数据建模驱动的设计,再到最新的微服务架构设计,等等。我想说,这些方法论大多是针对那些大规模应用而言的,你需要了解他们,并有意识地在你的系统设计中去匹配这些优秀的架构和设计思想,这有利于你做出拓展性良好的系统,从而避免了因整个系统复杂度的提升而导致大规模重构的风险。"

对照技匠社这个网站来看,需要定义三个实体类:User(用户),Resource(资源),Feedback(反馈)。 围绕这三个模块,再定义出三个服务:UserService,ResourceService,FeedbackService。 接着再为这三个服务设计需要用到的方法。

  1. UI设计 对于资金充裕的项目,需要由专业设计师来操刀。再不济也需要专业的前端设计和美工,然而很多小型项目,由于***没有钱***,很多时候甚至由后台程序员来凭感觉画一画(比如“果核”)。所以有空时,学一点设计,或者不需要刻意去学,多去领会一些美,品味自然会提升一些,这在我看来是很有必要的。 实际情况是,很多网站开发都会套用开源的模板,这样可以避免重复造轮子,更为便捷舒适。但是使用模板也有他的缺点,大致分为以下几点:

    • 毕竟是别人的东西,对其思路不熟悉,在拓展时往往牵一发而动全身。
    • 模板包含了大量的对手头项目来说多余的和不必要的东西,这需要我们花时间去小心地剔除。
    • 模板本身存在缺陷,需要我们修复。
    • 在拓展新界面时,需要考虑和原模板的搭配,再次设计。
  2. 前端开发 就针对技匠社这个网站而言。 目前最流行的前端框架是AngularJS和React。在这个项目中选择的是AngularJS,有以下两个方面的原因:

    • 我需要的是一个更完整的JS框架,AngularJS能满足我在全面性方面的要求,可以使用它构建一个完整的Web应用。
    • 我希望在将来用Ionic写一个App,由于Ionic也是基于AngularJS的,这意味着,我将来可以复用很多代码。
  3. 后台开发 SpringBoot:开发基于REST的服务。 MyBatis:提供基于SQL的持久层支持。 Redis:持久化用户的Session信息。 SpringSecurity:提供安全方面的支持。 MySQL:使用传统的关系型数据库。 Maven:项目的包依赖管理,以及项目打包。

Spring Boot并不是Spring的一个升级版本,而是一个为构建微服务提供更好支持的全新框架。他是一个能够提供良好拓展性的框架,在初期可以将所有的功能作为一个整体对外服务,随着用户量的上升和系统规模的不断扩大,可以借助Spring Boot,并基于Domain Driven Design的设计思想将系统的的服务进行拆分,构建出一系列微服务。

  1. 部署+运维 对于这块这块不是很了解,不过至少需要会用Linux+Tomcat/Jetty+Apache+Nginx

以上基本就是一名全栈工程师能够做的事情。

技能树

  1. 逐渐接触使用命令行
  • 在最初学习编程的时候,每一门语言都有集成了编译器的IDE,这些集成开发环境十分方便,往往只要在图形化街面上点击一个按钮,就能完成一系列复杂的操作。这会让人觉得,这是顺理成章的事。而现在的很多工具,都在往简约高效方向发展,有的甚至没有图形化界面。
  • 打个比方,就像在玩CS这款游戏的时候,可以调取菜单,然后通过点击按钮来购买装备,这似乎并不繁琐。但是假如你想训练自己的闪光弹投掷技巧,需要购买无限的闪光弹,并在闪光弹投出以及碰撞的时候留下可见的抛物线,那通过菜单点击操作就十分繁琐了,很多玩家往往直接调出控制台,输入指令来完成这些操作。
  • 这和使用命令行来控制你的操作系统有异曲同工之处。命令行在一些环境下可以提高工作效率。当然并不支持完全抛弃图形化界面。

"以前,我在启动一套本地的开发环境时,总是需要手工地一个个去单击那些服务,逐一启动web服务器,数据库服务器,打开IDE等等。这看起来每次只需要花费2-3分钟的时间,但这是每天每天都需要进行的操作,而且由于调试需要,一天之内需要重复启动好几次。一个月下来,我光在启动环境的时间就花费了2-3个小时。后来,我便学着写了一个shell脚本,其实非常简单,就是按照顺序去启动服务的命令,这样我只要单击那个脚本,整个环境就搭建好了。因此,我经常鼓励身边的程序员去写自动化脚本,让自己从重复性的工作中解脱出来。"

  • 使用Git命令行来进行版本控制
  1. 代码重构 封存,以后再写。

  2. 规范代码

  • 封装/继承/多态使代码更简洁,可复用率高
  • 尽量规范代码的书写,尤其不要使用中文以及尽量不要使用pinyin。
  • 常写注释
  • 多考虑异常捕获情况
  • 等等

暂时就写到这,这本书整体还是不错的,但是还是有点偏鸡汤型,这种类型的书现阶段而言只需读一两本就够了,把握一下方向,更多还是需要去践行。

公众号:果核里的图灵