当我们在说客户端的时候,我们在说什么

写着前面

传统意义上的客户端(Client)是从PC开发时代产生的概念,一般是指一个运行在pc上的程序,通过网络通讯和服务器进行交互;比如我们可以称魔兽世界的游戏程序为客户端

随着移动互联网的崛起,客户端逐渐变成了代指app的名词,比如手机QQ Android / iOS版,可以被称为客户端

好了,现在我们来说说,从技术上看客户端(app)到底是什么

关于原理


进程上看,多数app都只有一个进程——界面绘制,数据处理,都在这一个进程里

最常见的工作模型是: 一个消息泵(或称一个消息分发循环),在有消息来的时候,进行分发,各个模块在回调里进行处理

所以接触过iOS / Android编程模型的同学会很容易地发现,你的大部分业务代码是填充在系统给的回调里的,执行完毕之后控制权会回到消息泵手里,iOS 叫 runloop,Android 叫 looper

好的,到这里我们先大致了解一下app的工作模型,暂时不涉及平台细节;

这里特别想说的是,知识的理解有两个层面
  1. 一个层面是逻辑性的
  2. 另一个层面是知识性的

app的工作原理属于第一个层面的东西,这是我们今天想着重讲的,至于哪个api是干什么事情的,属于第二个层面,这个领域的知识不用急,用到的时候自然有文档,会随着一个人的经验不断的积累,慢慢来就好

刚刚只讲了原理,那么我们来谈谈app领域的具体的技术

关于技术

Native开发:一般是指用原生语言直接进行开发(界面绘制,数据处理等),iOS一般多用objective c,swift; Android 一般多用java,kotlin

Hybrid开发:一般是指用使用 html + js + css进行界面绘制,数据流动一部分在js内部,一部分在native层面;为什么能这么做?简单地说,iOS / Android系统都提供了webview这个控件,而且都能够在要打开什么链接,要执行什么js函数的时候,给native层一个回调,这就为数据交换提供了基础

跨平台开发:主要想要解决两个平台(iOS / Android)使用统一的方式处理交互逻辑 + 数据逻辑,比如Flutter就是这样的方案,flutter提供了一种中间语言Dart——开发者可以使用dart在iOS Android两个平台进行开发(而不是oc / swift, java / kotlin),当然想象一下,要做到这一点,dart运行时的底层一定做了和平台的接驳——类似jvm能同时在linux 和 windows上提供java运行能力

Native开发一般适用于对体验要求较高的场景,因为它能够给程序员对程序性能最大限度的控制权

Hybrid开发 / 跨平台开发,其实有些交集,优势一方面在于一定的灵活性一方面在效率,比如,两端都用同一个hybrid / flutter页面,那改一下就能有两端的收益;一个公司可以找少量的native工程师快速搭建好基础,然后找相对多的h5 / flutter 工程师快速实现产品功能

信息流类的app(具有大量不同布局的页面承载海量内容,比如新闻类,电商类)一般一定会通过hybrid或者其他跨平台技术来提高开发效率

关于实战

好,这是一些现状,现在来谈谈情怀,我个人比较喜欢native开发,首先我是一个iOS研发,从现在的平台能力上看,swift已经提供了足够的能力,承载很多设计方式,能够拿出一些优雅的方案(相比oc);当然我们这里不讨论是否能跨平台,从能达到的高度来说,追求极致体验,应该双平台都用native开发,但这最终也要看产品形态和团队的人才构成

我们从computer science的角度来看看,一个native端的研发平常都在干什么
  • 画界面,写交互逻辑
  • 摆弄持久化方案,比如db,kv
  • 发各种网络请求,通过操作系统api,或者某些中间件,比如AFNetworking,OkHttp
  • 各种性能优化,这里加入多线程能优化什么,这里如果换一个数据结构能做什么优化,怎么少用一点内存

嗯,看起来一堆杂事,不过细想一下
界面卡了怎么办?来我们优化一下,可能就需要深入到一些很底层的知识上了,这个元素是gpu画的还是cpu画的,如果是cpu画的,和gpu画的性能差多少倍?要回答这个问题,可能得知道显存是怎么映射到内存的,NUMA,UMA架构的相关知识

这里的多线程方案经常有OOM,那为什么OOM?一条线程的开销是什么?线程的堆栈在内存里是什么样的?线程的逻辑结构在内核里是什么样的?纤程的方案考虑过没有?

这里的DB操作居然用了1.5s?好,db的页缓存参数设置对了吗?表里建索引了吗?db放在sd卡还是操作系统内置的存储里?NAND上哪种文件系统最高效?对了,确定需要db,不是kv?

内存泄漏了?好,引用计数的背景下泄漏的原理是什么?标记清除的gc泄漏的原因又是什么?有没有办法自动检测内存泄漏?

坊间有句话,下能修马桶,上能造火箭;上一个台阶看,一个到位的客户端研发,应该能挫其锐,解其纷,和其光,同其尘;

如果你真的是一个能人,客户端绝对是一个足够大的竞技场,没有技术上的天花板,也很难有职业生涯上的天花板——从海外一线(FANG)到国内传统公司,都招大量客户端的岗位

坦诚一点,我是带着目的来的!希望给刚刚入行的同学一些overview,让更多人才能选择客户端这个方向

从行业角色看,客户端做的是一个看得见摸得着,直接面向用户的软件,想要效率可以选择效率,想要体验可以选择体验;想要创业,可以选择从一个app开始创业;

最后,不要因为一个app运行在一个看起来很小的设备上就觉得它简单;
  • 简单的app大概在10W行代码左右;
  • 稍微复杂一点的,大概在20~30W行;
  • 一些巨型app,比如dau超过10亿的,一个端600~700人都很正常,代码量可能在1000w~2000w;
现在的移动设备,其实能力都很强,很难从性能体验上感受到一个app的重量(参考早年64M ram的pc跑一个photoshop要读磁盘读一两分钟),用户看到的只是一个app,轮流几个界面换一换,其实这背后有设计上的,优化上的大量心血和投入

相关职位

社招职位

抖音音乐方向,iOS工程师

https://taou.cn/jqJLe

2021校招提前批职位

所有校招职位都可以填写的我内推码:3UMFC7W

客户端工程师


前端工程师


2021校招提前批其他方向

后端工程师

上海:https://job.bytedance.com/campus/position/detail/6835619069605972237

杭州:https://job.bytedance.com/campus/position/detail/6835620228647356686

测试工程师

测试开发工程师

平台研发工程师(质量保障方向)

C++客户端开发工程师(音视频方向)

多媒体视频算法研发工程师

多媒体客户端研发工程师

高性能计算研发工程师



技术美术(特效技术方向)

C++桌面端研发工程师

渲染引擎研发工程师



AR特效开发工程师



多媒体图形/图像研发工程师


另,北京/杭州/深圳/成都区域可通过https://job.bytedance.com/campus/position?keywords=%e6%8a%96%e9%9f%b3&type=2投递。






#2021届秋招进度交流##字节跳动##内推##社招##校招##提前批#
全部评论
请问校招提前批的面试结果会对正式批有影响吗?
点赞 回复 分享
发布于 2020-06-26 19:22

相关推荐

不愿透露姓名的神秘牛友
11-21 19:05
点赞 评论 收藏
分享
想去夏威夷的小哥哥在度假:5和6才是重点
点赞 评论 收藏
分享
2 12 评论
分享
牛客网
牛客企业服务