‘Don't let the noise of others' opinions drown out your own inner voice.’
初入大学以及初入计算机专业,快速了解专业具体情况并获取有效信息是非常重要的,可惜这部分经常被忽略导致很多同学到了高年级之后依然对专业感到迷茫。
正好前段时间计协上线了 Wiki 系统,正好借由这个平台和机会,我也想写一些相关的文档做回馈,为各位学弟学妹们解惑,帮助他们快速进入这个专业乃至行业。但我虽然有些许经验和感悟,也依然算是新手阶段,分享中必然会有不足和错误之处,希望能抛砖引玉吧。
本次分享主要向大家介绍互联网行业中一个曾经很热门但目前快速降温的方向,即招聘中的客户端方向,主要包括 iOS、Android 和桌面客户端三个主要平台。本人为 iOS 方向,所以主要围绕 iOS 来讲,Android 端情况大体相同,桌面客户端一般主要是传统企业和游戏客户端在招聘中需求较大,前者各个公司具体要求不尽相同,后者对技术栈要求与 iOS/Android 大相径庭,故不在本文涉及范围之内。
客户端作为非常实用、易于教学、能快速出成果的教学点,在高校内的教学大部分都以老旧的 Windows 桌面开发为主,其中较少会引入 C#、Qt 等开发技术,已经完全过时的 MFC 占据多数。部分软件工程专业会以选修的方式开设安卓开发,譬如我校软件工程专业,聘请企业人员作为教师来为软工同学教授,选取教材为《第一行代码》第三版,开发以 Kotlin 为主,Java 为辅,能为同学提供基本的入门知识。极少数高校会开设 iOS 开发课程,主要原因为 iOS 开发必须使用 Mac 设备,成本较高,且 iOS 开发技术普适性亦不高,有相关技能的教师亦少,高校开设相关课程的意愿不强。
在之前十余年由 iOS/Android 带来移动数字通信变革的时候,iOS/Android 开发是行业热点,移动 App 的社会培训班日益火爆,但培训质量良莠不齐,导致向社会输送的人才水平参差不齐。近年来,由于互联网商业模式的定型,以及主要盈利点转变为流量的转化,所以后端的需求持续增长,相关技术也层出不穷,对人才量的需求也日渐走高。而移动客户端的主要工作则转变为以维护老旧项目为主,辅以性能调优,又因为网络监管的需求,客户端的热更新不如网页前端更为方便,而以前端技术为核心的小程序日渐壮大造成冲击,所以各中小企业更倾向于成本更低,技术更为通用的小程序和前端开发。同时基于成本考量的跨平台开发的出现,如 React Native、Flutter 技术,客户端原生开发的前景和空间被进一步压缩,目前招收客户端的岗位主要集中在有相关大体量 App 的大厂之中,如字节(抖音、头条)、阿里(支付宝、淘宝)、腾讯(微信、QQ)、美团、网易等。但小程序或跨平台开发依然需要原生开发进行适配,贸然采用跨平台方案以节省成本极易造成后期花费数倍的成本进行修补,所以原生开发依然是客户端开发主流,有其不可替代性。同时技术水平较高、能综合利用多项技术的人才依然缺少,这部分人才是企业重点招聘对象。
目前 Android 开发大部分已切换至 Kotlin 语言,但 Java 依然是必须掌握的语言,部分 NDK 开发可能需要相关 C++ 知识。iOS 开发目前国内依然以 Objective-C 为主流,国外及国内部分业务部门采用 Swift 进行开发,或存在混合开发的情况。
互联网大厂进行招聘时主要还是以数据结构、操作系统、C/C++/Java 语言基础为考察重点,辅以算法考察,难度为 Leetcode 中档题难度水平,偶有出现简单或困难题,有蓝桥杯基础的话多刷题可达到相关要求,有 ACM 基础的话熟悉相关题目思路即可。除此以外大部分企业会较为看重学生的项目经历和竞赛成绩,应届招聘时也会查看是否有相关实习经历,这三个部分需要学生对参加的项目/竞赛有足够的掌握程度,并且能与面试官就其中要点进行交流和深入思考。
在实习阶段工作和技能学习较为轻松,有的企业可能是单独给定实际业务中的一个小优化点让实习生进行独立开发,也有企业是让实习生参与到实际的业务开发中。这部分不同企业不同部门的规划不尽相同,以我个人实际经历为例,在字节北京参与了 VNC 方案的调研和优化的业务以及 Swift 内存布局和互访的调研,在网易互娱广州进行了 Swift 视频压缩库的开发和视频压缩方案的效果对比,其中后者的日报和初版实习报告可以参见 该文档,可以此一窥企业实际开发内容和情况。
对于基础语言需要深入学习,包括 C/C++、Java,其中 C 推荐《C Primer Plus》(只需要部分章节/段落,不重要的部分可以略读或不读,下同),C++ 推荐《C++ Primer》,Java 则推荐《Java 核心技术》,重实践,重原理。其中 C 语言作为入门编程的基石,为后续的学习打下基础,重点学习编程语言基础知识,另外可以关注内存相关的分配和布局。C++ 则为入门 OOP 的基石,关注对象的生命周期,重载、重写、继承、构造/析构函数等概念,以此作为学习其他 OO 语言的基础,同时学习使用 STD 标准库,并调用相关数据结构解决问题。Java 重点关注使用 OO 的概念解决实际问题,各容器的大体原理和使用方式,同时基础 Java 水平也是后续 Java Web 学习的基础。
其他语言可以结合兴趣按需学习,如 JavaScript、Python、HTML、Markdown、SQL,本文不再介绍各语言的选择和适用范围。
语言只是工具,需要用到的时候学习即可,但一定要对基础的经典语言有清楚明晰的认识和掌握,注重实践和实际环境中的语言特性。
四大基础专业课数据结构、操作系统、计算机网络、计算机组成原理除了最后一门外都需要重点学习,注重对经典知识点概念的掌握,如各种数据结构的概念和复杂度,操作系统调度、多线程和内存分配的相关思想,HTTP 协议的概念和机制等等,这些概念大多会作为面试题提出,虽然后期会有八股总结来临阵磨枪,但单纯背书和有自己的理解是两回事,很多情况下面试官并不会局限于基本概念甚至不会局限于书本概念的提问,需要学生对相关概念有所实践以及有独到思考。计算机组成原理因为距离互联网行业较远一般不做要求。
此部分数据结构需要大量甚至是全面的编程实践,其余两门可以按照个人方向和兴趣按需进行编程实践。本人由于较多时间放在工程方面所以对这些基础知识较为薄弱,不再给出更多建议。
目前 iOS 可以直接从 Swift 开始学起,Objective-C 虽然依然是主流而且老项目不太可能从 Objc-C 迁移到 Swift,但可以预计未来一定是 Swift 占据主流,并且有 Swift 和 C 的基础后学习 Objc-C 的难度将大大降低(但依然不可否认的是 Obj-C 的语法可能是非小众语言里最晦涩的...)
Swift 的学习可以由 Swift 教程 本文档教程开始,浅尝辄止,注重实践,不求面面俱到但求理解概念,后续实际开发中遇到问题再回来进行学习即可。基础语言的学习时间根据个人时间精力分配约 1-4 周为宜,之后即可进入实际 App 开发。
Linux 的相关概念和命令需要掌握,Shell 编程部分可粗略学习。数据库、数据库命令需要掌握,相关脚本语言也需要了解和实践,课内课程多以 Mysql 为主,其也为业内主流,Oracle 在互联网企业中几乎寥寥,传统企业中可能也不多,除此以外非关系型数据库也需要了解,如有机会也应当尝试。
除此以外更多的是一些实际开发技能的积累,如 JSON 的序列化与反序列化,前后端通信方式,IDE 的使用(不要笑,这部分课内是忽略的但其实实际移动开发中离不开,也不难),Google、GitHub、StackOverflow 等网站的使用,Git 的使用和思想,包管理,各大框架/库的使用,只能说多实践,多在实际工程中去体验,多考虑问题的实际复杂性,不要因为是在学校或者因为是在学习过程中就理想看待问题。
另外还有体育课(广义上的)以及个人的兴趣爱好如弹琴、旅游、看剧、游戏等等,注意身体健康,珍惜空闲时间,不管是学习还是工作还是娱乐,都不要浪费浑浑噩噩,选择计算机不光意味着高薪、好就业,也意味着终身学习、空余时间的消失殆尽、压力陡增。
iOS 开发主要在 Apple 开发出的各框架下进行 App 构建,辅以第三方开发的网络、持久化存储、UI 等框架。在有 Swift 基础后,可以通过 The 100 Days of SwiftUI 教程通过 SwiftUI 进行 UI 搭建和 App 构建的学习。亦可由 UIKit 进行学习,但学习曲线较 SwiftUI 更为陡峭,且需要一定 iOS 开发基础,推荐以 SwiftUI 入门,后续补足 UIKit 的开发知识。同时在开发中会涉及到其他官方/非官方框架的学习和使用,如 CoreML、ARKit、SpiritKit、Alamofire 等。初学时只需要学习引入和基本的使用即可,官方闭源框架的逆向和第三方开源框架架构的学习是工作后更为进阶的学习内容。
iOS 开发主要学习以自学为主,尤其以通过 Google 学习为主,国内大部分论坛内容均为搬运自国外论坛(所以基本的英语听说读写能力也非常必要)。同时每年的六月苹果都会召开 WWDC,大家可能只关注第一天的发布会,但其实 WWDC 最精华的是后续放出的各个 Session,在其中苹果的工程师们会为全球各地的开发者带来新系统的新功能、新特性,新框架的使用方法,新的设计语言标准,是名副其实的Talk is cheap, show me the code 环节。同时该大会还有专门为学生举行的 Swift Challenge 比赛,希望以后能看到同学们踊跃参赛获得奖学金的身影!
蓝桥杯、ACM、数学建模比赛、互联网 +、大创都是很好的平台和机会,但是一定不要有从众心理,全都参加。根据自己的特点和目标,选择一到两项比赛全力以赴就够了。其中个人以为蓝桥杯难度适中大一有基础即可参加,ACM 如果没有高中竞赛经历或者这方面天赋的话性价比不高且极耗精力。
以 iOS 方向来说的话移动应用创新赛是一个非常不错的平台,其由苹果公司和浙江大学联合主办,教育部承办,是一项门槛较低,上限极高的新兴团队比赛。我校这项比赛主要是设计院在参加,也有不错的成绩,计算机专业几乎无人参加。本人有幸参加过两次比赛,收获颇丰,比赛中也遇到了很多在开发和设计上有独到见解的优秀当代大学生。
客户端开发其实是比较繁琐和辛苦的,虽然目前入职竞争不算激烈,但有一个月两到三次的发版,实际开发也涉及方方面面:后端岗位涉及的数据库,它需要涉及;前端岗位涉及的 UI 优化,它需要涉及;算法岗位涉及的机器学习,它需要涉及。除此以外,多线程、系统交互、网络请求、硬件控制……脏活累活,一个不落!再加上某脉上日常吹嘘的客三消(客户端岗位三年内就会消失)和 35 岁被优化以及这两年的互联网寒潮,客户端其实并非是一个稳妥的就业方向选择。但是同学们在选定方向的时候,在充分调查听取意见并根据自己能力和特点进行选择之后,一定要有信仰,正如本文题目下的那句名言告诫的一样。况且我以为,技术要素其实并不能代表个人全部的竞争力,创造力同样重要。不管选择什么方向,一定切忌死板使用技术或者唯技术论,正如在企业中,产品才是创造商业价值的人,开发只是实现目标的途径。
我的这篇文档也只能是管中窥豹,一家之言,只是希望给大家介绍一些相关的信息,后续也会慢慢完善和优化,希望能帮助到你。