name:Gowa2017 Zhang

email:Gowa2017

github:Gowa2017's Code Hub

工作这么多年,很多技能和知识其实都是在不断补充的。但要说我最开始也最有用学习到的知识,还应该感谢 W. Richard Stevens,他的大作 APUE/UNP/TCP/IP 都完整的了解过。对于更接近于系统层面的东西奠定了我的基础。

自述

电子专业毕业,当年酷爱游戏 MMORPG 。传奇世界,天龙八部,倩女幽魂。。。由此而来的对于计算机的莫大兴趣,工作兴趣集于一身,岂不更好。系统层面的东西基础比较牢固,开发方面的知识有点软。崇尚定量工作,讨厌为了加班而加班。任务完成即可收工是最棒的企业理念。现在带领一个小团队做政务项目。

工作经历

  1. 2011-9 —— 2013-6 深圳华强北,国内一级手机渠道商,后面负责粤西几个地市运营商相关业务。为了兴趣与梦想,转行了。
  2. 2013-11 —— 2016-6 东莞一家计算机企业干活。主攻 MySQL/Linux 环境相关。外加 Lua 做脚本逻辑开发。运维活,实在没有什么太大的成绩。嗯,我存在的价值其实就是解决总是会出现的各种莫名其妙的数据,性能问题。
  3. 2016-9 —— 2017-11 回老家,还是干运维活。国内一大型互联网企业,主攻电信业务。负责的是 AAA,DNS系统的维护,主导了一个DHCP项目的建立完成。提升技能:DNS协议,DHCP协议,组网知识,负载均衡,服务高可用。
  4. 2018-3 —— Now 终于转行开发。主要负责业务上的需求管理,进度管理。公司现在做市内几个区的业务执法系统,文书处理,数据分析比较多。后台 SpringMVC。人少,逃脱不了写代码的工作啊,虽然我非常喜欢代码,但是,每个程序员最终不往项目经理走,往哪里去?
  5. 基本技能

    有了这些基础,大多数时候,绝大部分问题,即使不懂,谷歌大法也能助我解决。

Unix

这个是一直以来的基础。对于 APUE/UNP/TLPI 看了很多遍,多数要点均能记住。从编程的角度来对系统进行了解。所以之前别人看我觉得运维工作干得非常不错,其实代码写得很少的了。

  • 进程模型 fork-exec-COW。每个进程都是 initd 进程 fork 出来的子进程,替换执行代码而来。
  • 线程模型(同步) 线程的出现,是为了解决 fork 的代价太过昂贵而生。事实就是在不重新开辟内存区域的情况下,将一些代码段的执行交给内核进行调度。内存的共享势必会涉及到竞争的问题,所以才有了锁,信号等的同步机制。
  • 阻塞IO/非阻塞IO。通常情况下阻塞的IO,我们必须等待内核把我们想要的数据准备好了,我们才会返回。经典的例子就是对于两个进程分别打开管道两端进行读写的时候,有可能是永远不返回哦。非阻塞IO在数据不可用的时候,会返回一个错误,接着我们的进程来回测试能操作不就行了。
  • epoll/select 非阻塞IO下,如果我总是要循环测试是否可读可写,这比较低效,如果我们能同时关注多个 fd,某个能用了就开始操作多好。这两个就是为了我们在关注多个IO事件时而来的系统调用。select 比较通用,问题再于 select 面对多个 fd(文件描述符)组成的集合时,有任何一个事件发生,都必须遍历整个列表来看是哪个发生了事件。epoll 呢,只会返回有事件发生的集合。
  • 信号机制。异步通信了。

TCP/IP

TCP/IP 详解第二 三版都看过很多遍了。对于常用的的各层,各种协议均了解。IP/TCP/UDP/ 这些自不用说。路由如何汇聚,隧道,NAT 等也有了解。事实上,我觉得当前应该了解的还是 IP/TCP 就差不多了。

对于IP层的了解,需要首先意识到, 1. 每个网络接口设备都有一个 MAC 地址; 2. 但并不是所有的设备都是直接物理相连的。IP 层要解决的问题,就是可能不物理相连,且链路类型不一致上的逻辑链路通信问题。路由器,是IP层的核心设备。有了全局路由表,才让互联网得以互联。

对于 TCP 的了解,首先要看一下一个简单的通信模型是什么样的。以C/S 为例, C 发送数据,S接收数据,S返回确认,C接收。这其中就会有一系列的问题:C 发送的数据 S 有没有收到?如果收不到等待多久后重新发送? C 发送数据的速率多少才合适?快了 S 处理不过来,慢了浪费资源? C 发送的数据在网络中传输有没有被修改?所以才有了 TCP 的速率协商,拥塞控制,校验和,超时重传,滑动窗口。了解问题产生的背景,才能明白 TCP 为什么会有那么多机制的意义。

从编程角度看,其实一个服务器只需要: socket(), bind(), listen(), accept() 就可以完成了。而客户端只需要:socket(),bind(),connect() 就可以同服务端通信了。

MySQL

对于 MySQL 的开始,来源于第二份工作,需要对数据库进行安装,备份,数据恢复等了解。然后才涉及到了解索引的意义,事务的使用及锁的相关知识。关于这点,了解一下 MySQL 执行一个查询的过程非常有用。

数据的存储,两个重要的指标就是:安全与效率。为了数据安全,所以备份很重要。为了数据的一致性,事务很重要。一个系统的瓶颈,大多产生在 IO 层面,所以索引的建立,会加快查询到想要记录的速度。

  • 索引
  • 事务
  • MySQL dump
  • Binlog
  • Explain
  • Join
  • 主从复制。

工作中。。。

虽然其实我很讨厌Java那冗长的包类名,但不能不说,其用起来确实很省心呢。只是我实在讨厌做UI啊,为什么一定要让我写安卓呢。

Java(当前)

  • SpringMVC 启动过程,绑定模式
  • MyBatis 动态 SQL
  • Poi Docx 文书处理
  • iText PDF处理
  • FreeMarker 模板转 PDF (利用 flyingsaucer
  • JVM(我是与 UNIX 系统类比来理解的其中的线程模型的)

安卓(当前)

当前的机器上,性能什么的早就不是瓶颈了。注意不要在处理 bitmap 的时候 OOM,不要傻傻的在 Activity/Fragment 里面写太多代码,不要动不动返回 Null 又不检查就传消息过去就好了。用户体验?做项目这个压根顾不上,等进度跟上了再考虑吧。重复:UI是弱项。

  • Dagger 依赖注入
  • ButterKnife 视图注入。解决 findViewById 到处写的问题。
  • Retrofit 网络请求。
  • Glide 图片加载
  • ObjectBox 本地数据库
  • MVP 架构。为了方便维护,修改,新模块都这样干吧。

虚拟机语言

无论是 Python, Lua, JS 都是解释性语言。我们编写的脚本,除了逻辑,大部分的事务都是由底层代码完成,我们在脚本中调用这些底层代码API,把注意力集中在逻辑上。性能的瓶颈应该都在于 解析-编译 这个过程会比编译型语言花上更多的时间和资源。

但其实当前这个环境,性能已经不是第一位的了。如何快速的出产品,才是比较OK的做法。

Python

主要是利用了轮子多,解决任务而用。为了处理异构数据,用 pandas 来进行处理后导入。 因为自己对于 TensorFlow 有兴趣,所以也会用 numpy。

另外,为了模拟请求接口,还研究了用 requests。

Lua

这个算是研究得比较深了。知识来源于 PIL。大爱这个语言的原因,来源于第一份有关的工作就是用 Lua 来执行很多很多的脚本,游戏逻辑,任务系统,怪物AI等等。当前工作压根用不上。似乎现在小游戏,前端后台都被 JS 一统了。我的游戏梦,怎么实现?

JavaScript

还未深入研究,不过在写页面的时候,又怎么会不遇到呢。不过,据说能用 JS 写的东西,最终都会用 JS 来写。所以,有有必要学一学呢。再说,node 的存在,也让我们用 js 写服务端程序了。

经常性的就是用 auto.js 干点手机上自动化的小活。