《码农翻身》读书笔记

前言

五一假期期间在家休息,把《码农翻身》二刷了一遍,之前很久也看过一遍但是刷第二遍还是有很大的收获,特别是 Java 技术栈相关的部分,有些话都是作者的一些经验总结,感觉很有必要摘录下来细品一番。

摘录

CPU
CPU 必须把数据装载到寄存器中才能进行运算
CPU 的运行速度快的丧心病狂,但是它能做的事情却简单得令人发指,主要有以下4种:
(1) 从内存的某个格子中读取数据,放入自己内部的寄存器 Rx
(2) 把 Rx 中的数据写入内存的某个格子中(会覆盖原有的数据)
(3) 进行数学计算和逻辑运算
(4) 根据条件进行跳转
对于那些大神级别程序员来说,汇编语言也是小菜一碟。Ken Thompson 和 Dennis Ritchie 不就用汇编语言写了第一版的 UNIX 操作系统吗?求伯君不就用汇编语言写了 WPS 吗?

Java注解
元注解:可以认为是注解的注解
@Target 表示该注解的应用目标,可以是类、方法、方法参数等;
@Retention 表示这个注解要保留到什么时候,可以只在源码中,或者在 .class 文件中,或者在运行时。
对于 @Controller @RequestMapping @Transactional 这样的注解,大家更喜欢和 Java 方法写在一起,显得简单而直观。

泛型
Java 泛型的限定符还支持 super,Comparable 应该写成 Comparable <? super T?>

协议
计算机所有问题都可以通过增加一个中间层来解决
Java JNI(Java Native Interface),可以用C语言来实现,然后在Java中封装一下。

Spring 的本质
我们在进行软件系统设计的时候,一项非常重要的工作就是把一个大系统按业务功能分解成一个个低耦合、高内聚的模块,分而治之。

什么是框架
  先学了 Java SE,把集合、线程、反射、I/O、泛型、注解之类的基础知识学了一遍。
  你如果对Java后端感兴趣,那还有更多东西可学。用框架实现了业务只是很小一方面,还有系统架构设计、缓存、性能、高可用性、分布式、安全、备份等很多内容。你学得越多,就会发现无知的领域更多,所谓学无止境,就是如此。

HTTP Server
我这样的英语水平,这几十页的英文 HTTP 协议我不吃、不喝、不睡两天也看不完。死猪不怕开水烫,慢慢磨吧。

Build 的演进之路
  大部分人只会抱怨项目很无趣,没有挑战,遇到问题也只会安于现状。只有少数人会发现工作中的“痛点”,并且真正动手解决它,给公司带来价值。这是提高自己,让自己和别人区分开来的重要方法。

再见!Bug
  每个程序员都梦想从头写一个东西,不愿意读别人的代码,甚至同行相轻,瞧不起别人的代码。但实际情况是,自己重写一遍,不见得比现在已经运行的代码好到那里去,甚至更差!除非你了解了所有的细节,用大量的时间仔细规划、小心编程,但是现实中哪有时间让你这么玩啊?

让人怀疑的C语言
  由于太底层,刚接触计算机的学生也不能写出操作系统、数据库、中间件等系统级软件,哪怕写一个简单的、粗糙的软件也难。只能写一点与数据结构相关的小程序,再加上被指针不断地“蹂躏璀璨”,很容易丧失斗志。
  其实学习是一个螺旋上升的过程,在这个上升的过程中,成就感很重要,直接决定了一个人能不能继续学习下去。我在刚学习C语言的过程中就因为没有成就感,差点放弃了。
  通常来说,带图形界面的程序容易激发成就感。所以,我认为C语言不太适合入门。虽然C语言不适合入门,但还是应该学习一下,因为C语言太贴近硬件了,能帮助你理解程序在机器层面到底是怎么工作的。
  想想看,自己用C语言写一个小的Web服务器、简单的数据库、简单的分布式文件管理系统,是不是也很酷?更重要的是,系统级编程博大精深,并且非常稳定,值得深入研究,成为专家。

赖以谋生的Java
《Effective Java》
《Java 编程思想》
《Java 核心技术》
《深入Java虚拟机》
《深入理解Java虚拟机》
  不仅看书,还去读 JUnit源码、Spring 源码、Hsqldb源码、Jive 源码,再加上工作中写的大量代码,终于可以得心应手地使用 Java 编程了。
  后来我明白了,Java 最适合的还是后端编程,别让它干那些它不想干也干不好的事情,如桌面编程。
  后端编程还有很多事情需要处理,像负载均衡、灾难恢复、缓存、消息、分布式、数据备份、搜索等。后端的技术还是相对稳定的,这些知识介于业务层和系统层之间,值得发掘和积累。
  很多时候用 Java 解决一个问题,基本上就只有那么一种方案,照着规矩做就是了。Java 本身的特点也适合大型项目的合作开发。

优雅的Ruby
  动态语言由于缺乏静态检查,所以只好把运行时的检查写好,这就是单元测试。对 Ruby 来说,测试代码量和业务代码量 1:1 是非常正常的事情,有的甚至是 2:1,动态语言都有这样的劣势,但我们主要还是要利用它们的优点,让我们的编程生活更加舒适,不是吗?

老司机的精进
  凡事必先骑上虎背,有了问题的引导,你会疯狂地学习,迅速地提升自己。
  对于性格内向的程序员,很多时候你认为基本准备好了其实就够了,凡事必先骑上虎背,勇敢地迈出去,努力地争取一下,你就会发现自己登上了更高一层的台阶。

好奇心
  对于程序员,如果你看到新技术、新产品没有像小孩看到新玩具那样两眼放光,没有立刻在自己电脑上试试的冲动,你就需要仔细考虑一下是否真的对软件开发有兴趣。如果根本没兴趣,那不要蓝费时间,还是趁早转行,有更多适合你的职业在等着你。
  没有好奇心,就不愿意学习新技术。一名架构师,如果没有对技术的敏感度和前瞻性,一直抱着一套技术架构不变,估计很快就会被淘汰。所以对技术的好奇心/兴趣是一切的基础。
  很多人会语法,也懂框架,但是在基本功上却不过关,因而只能在初级程序员上踏步。
  这个基本功的训练就是数据结构和算法,我的经验是多做习题,让这种思维在脑子里固化,以后的编程就可以信手拈来了。

透彻理解技术的本质
只是学会使用是不行的,不但要知道 How,还要知道 Why。
停下来,思考,才是进步的本质。

写出漂亮的代码并不容易

  1. 需要思路清晰
  2. 有良好的编程基础
  3. 有优秀的抽象能力
  4. 对一门语言的熟练掌握
    学习Java开发的可以思考一下为什么 Spring 有 Controller、ViewResolver 这样的概念?

技术领导力
  要用技术的影响力来领导人,而不是威权和职位。换句话说,就是要能让技术人员服你。有了技术影响力,你在团队里发出的声音才会被倾听、被尊重。但影响力不是很快就建成的,这是一个漫长的过程:你解决了一道技术难题,你提出的方案被证明可行……

对自己狠一点,开始写作吧
  如果你们把一门技术通俗易懂地给别人讲明白,那就说明你已经掌握了。这种“转教别人(Tech others)”的方法属于主动学习,效率是最高的。但是在工作和生活当中,你是很少有机会去给别人讲授的。既然没法给别人讲,那就退而求其次吧,把自己的理解写出来。
  有人可能要问了:我也可以按照这个思路去学习,为什么要写下来呢?原因很简单,不写出来,很容易放弃深度思考。你会觉得,我已经知道是怎么回事儿了————其实一些关键的细节被大脑给忽略了。
  我们已经进入了一个碎片化的时代,我们的大脑已经养成了碎片化文化的习惯,一天不看碎片化的信息就觉得不舒服,这样下去会慢慢地丧失深度思考的能力。写作会逼着你思考,梳理知识体系,防止自己被碎片化所填满。
好的程序员都是代码喂出来的,动手实践必不可少,所以我还经常写代码。
优秀和平庸的差别可能就是那一点点坚持吧!坚持不懈地做一件事,每天前进一点点,最后量变会发生质变。

翻译资源管理系统

翻译资源管理系统

Author Scott Yu
E-mail yusureyes@163.com

项目介绍

  这是一个用于管理多语言资源的译文管理系统,由于用户分布于全球各地,公司的 App 需要显示多语言,Android 和 iOS 有大量的译文需要管理,手工维护极其麻烦,于是这个系统诞生了,方便 translator 在平台翻译,翻译完成之后,开发者将一键导出代码,直接放置在项目中。

  • 注意 translator 需要自己找人翻译,本系统只是维护译文资源,并不会自动翻译。

    公司 App 下载方式:软件商店搜索 Yeelight

软件架构

Tools Version
PHP 7.1+
Mysql 5.6+
框架 Laravel 5.3

安装教程

  1. git clone 项目至本地目录
  2. composer install
  3. cp .env.example .env 修改配置信息
  4. php artisan key:generate 生成 APP_KEY
  5. database/sql 找到 SQL 文件导入数据库
  6. 配置 Apache / Nginx 站点,浏览访问

如果 storage 不可写,请赋权限:
chmod -R 777 storage

演示地址

http://translate.demo.yusure.cn
管理员账号密码: admin 123456
Translator账号密码: translator 123456

使用说明

如何录入源语言(中文)
  1. 创建应用(可以后期创建):可以将多个 Project 分配到一个应用下,因为项目迭代会出现多个 Project,为方便管理,增加应用管理。
  2. 创建项目:点击 Project List,勾选需要翻译的语言,右上角添加项目
  3. 回到 Project List,点击 “录入” 按钮,一个小键盘的图标,录入 key(程序用的) 和 源语言(中文)
如何配置待翻译语言:

修改配置文件config/languages.php

return [
    /* 英语 */
    'en'    => 'English',
    /* 韩语 */
    'ko'    => 'Korean',
    /* 法语 */
    'fr'    => 'French',
];
原文录入完成之后,如何邀请 translator 帮忙翻译:
  1. 首先帮 translator 创建好账号,并发送给他。
  2. 点击查看 Project,在语言管理页面,点击红色的小手图标邀请按钮,将其账号勾选提交。

  3. 在邀请的图标后面是锁定功能,锁定之后,translator 不能修改译文,在 translator 完成翻译之后,该语言的译文自动锁定,如果需要修改,管理员可以随时解锁。
  4. 最后面是给 translator 发送邮件提醒,邮箱是帮 translator 创建账号时添加的,发信配置在 .env 文件。
如何配置对照语言:

例如翻译英文需要参考中文,翻译法语需要英文作为参考,那么就需要修改这个配置文件
config/translator.php

如何导出译文:

当译文都 ready 的时候,需要导出译文,导出译文有两种方式:第一种基于语言去导出,第二种针对整个应用(可以合并多个 Project)可以导出压缩包。
目前可以导出三种格式 Android xml、iOS strings、RN js。

translator 视角
  1. 支持对译文资源进行评论
  2. 支持标记有问题的译文资源,方便后续定位。(注意必须要处理掉所有标记才能完成翻译)

项目截图

本项目在公司内部运行半年有余,经过很多细节优化,为 Android、iOS 工程师提供了便利,现在将其开源出来,为开源事业添砖加瓦!
本项目为开源项目,允许把它用于任何地方,不受任何约束,欢迎 star、 fork 项目。

大神级程序员和普通程序员的区别

    为了了解那些大神级程序员和普通程序员的区别,采访了很多世界高端科技公司的软件工程师。发现这些给世界带来巨大影响的的工程师们至少有以下几个共同的思维模式:

首先要勇于去研究自己不懂或不熟悉的代码

    一般程序员都不愿意去研究自己不曾接触过的代码,很多人都没有尝试就放弃了。如果你经常去研究你没有接触过的代码,你就会越来越熟悉不同的代码结构和设计模式。现在程序员很容易就接触到优质的开源代码资源,可以很方便的就下载下来做一些改动或者调试,去研究为什么代码可以这么写。

除了代码之外,很多人对于陌生的工作内容也会感到抵触。每次换工作的时候,可能都会遇到新公司的工作内容和以前工作的内容不一样的情况,以至于刚开始的时候,工作效率没有以前那么高。

其实,所有程序员都是在学习的过程中成长的。在一个陌生的领域,没有人可以从一开始就是大神。如果你想在你工作的领域,变得越来越强,无论是写代码,或是与人沟通或者其它的技能,都是需要投入大量时间去学习的。

- 阅读全文 -