Windows Phone工程师培训讲解:浅谈C++数据结构学习的重要性
我做Windows Phone开发快8年了,最早入行的时候,身边全是会C++的数据结构底子扎实的前辈。那时候我还不太理解,为什么做移动开发非要啃透数据结构,随便找个现成的轮子调包不行吗?这么多年走下来才发现,当初花大功夫啃下来的C++数据结构,是后来解决所有问题的底子。
说回Windows Phone开发本身,当年这个系统和iOS、安卓三分天下,应用跑在限定硬件配置的手机上,资源有限得很。你写的代码多占1M内存,用户就能感觉到手机卡了半秒,掉一次帧,下次可能就把你的应用卸载了。我刚入职那会,带我的老师傅就要求我们所有人,先回去刷一遍C++的数据结构,再碰项目代码。
那时候年轻气盛,我觉得不就是几个链表、栈、队列吗?我都背过定义了,至于花一个月重新练?直到第一次做应用内的消息列表功能,我为了图省事,直接用了数组存所有未读消息。功能是做出来了,可一旦用户未读消息超过100条,滑动列表就一顿一顿的,我盯着性能监视器看了半天,才发现每次删除已读消息,数组都要整体移动元素,这一下就占了近20%的CPU。
后来还是老师傅点了我一句,换双向链表试下。我改成链表结构之后,删除操作的复杂度直接从O(n)降到O(1),滑动掉帧的问题直接就解决了,CPU占用一下子掉了15个点。那时候我才明白,数据结构不是书本上应付考试的名词,是真能解决实际性能问题的工具。
很多想学编程做开发的朋友,上来就问,现在各种高级语言都封装好数据结构了,我为什么还要自己用C++学一遍?我给大家举个最简单的例子,你开车不需要知道发动机怎么转,但如果你开的是一台有年龄的车,跑在半路上抛锚了,你懂发动机原理就能自己排查问题修好,不懂就只能等救援,错过 deadlines。
放到开发里也是一样,现成的轮子是好用,可轮子也不是万能的。你做Windows Phone应用的时候,要适配1G内存的老机型,现成的集合类可能会帮你做很多额外的扩容操作,这些操作多出来的内存消耗,在大内存设备上看不出来,放到老机子上就会让应用直接闪退。如果你自己懂数据结构,你就知道,针对这个场景,我不需要自动扩容,用固定大小的栈结构就能满足需求,省下来的内存就能给用户更流畅的体验。
而且,C++本身是偏底层的语言,你用它学数据结构,能直接接触到内存分配、指针操作这些底层逻辑,不是套个泛型接口就完事。你自己写一遍链表的插入删除,你才会明白指针指向错为什么会内存泄漏,为什么循环链表会让程序直接跑死。这些坑你自己踩过一遍,之后用任何语言开发,你都能下意识避开这些问题,而不是出了问题就一头雾水,不知道从哪查起。
我见过很多刚入行的开发,框架玩得特别溜,各种API调用顺得不行,一碰到性能优化和底层问题就懵了。为什么?就是因为数据结构的底子没打好,只学会了调用别人写好的东西,根本不知道这些东西底层是怎么跑的。比如你要做一个图片缓存功能,为什么用LRU算法效率最高?LRU为什么要用链表加哈希表的组合结构?这些东西你靠背结论是没用的,你自己用C++实现一遍,就明白为什么单种结构满足不了需求,组合起来就能把时间复杂度降下来。
放到现在来说,很多人说Windows Phone已经没了,讲这些还有什么用?其实不管做什么开发,底层的逻辑都是通的。现在做移动端跨平台开发,做桌面端开发,甚至做嵌入式开发,C++和数据结构都是核心底子。你想进大厂,面试的时候手写红黑树、手写快排都是常见题,这些东西靠背代码根本过不了,面试官一问你为什么这么设计,你答不上来直接就被刷了。
我前两年帮公司面试校招的开发工程师,碰到过一个孩子,简历写了做了好几个移动端项目,功能都做得很漂亮,我就让他说一下list和vector在插入删除的时候性能区别是什么,他说不出来,只说我知道用哪个就行。我又问他,如果我要频繁在中间插入元素,选哪个,他也说不对。其实这就是最基础的数据结构问题,哪怕你自己用C++写过一遍两种结构,都不会答不出来。
还有很多朋友说,我就是做业务开发,不需要懂这么底层的东西。确实,大部分业务开发,你调调包拼拼页面就能完成任务,可你想往上走,想做架构师,想解决别人解决不了的问题,数据结构就是绕不开的坎。同样一个需求,两个人写出来的代码,性能差个三五倍很常见,差就差在对数据结构的理解上。选对了结构,代码写出来简洁又流畅,跑起来还省资源,选错了,就是一堆bug,天天加班改性能问题。
我自己最深的感受就是,刚工作那会花了三个月啃C++数据结构,刷了近百道相关的题,这个功夫花得太值了。后来不管是做Windows Phone应用优化,还是转做Windows桌面开发,碰到性能问题,我第一反应就是是不是数据结构选得不对,一查一个准,大部分时候换个结构问题就解决了,根本不用天天对着堆内存找泄漏。
说这么多不是说让大家学开发就只啃数据结构,而是说,基础的东西一定要打牢。不要总想着走捷径,上来就学框架学速成,基础不牢,往后走肯定会碰到瓶颈。你用C++把数据结构吃透了,再学任何高级语言,任何新框架,你都能快速看懂底层逻辑,上手比别人快得多,碰到问题也比别人会解决。
毕竟编程做开发,说白了就是处理数据,你连数据怎么存怎么取都没搞明白,怎么能写出好代码呢?
Windows Phone工程师培训,C++数据结构,数据结构学习,数据结构重要性,C++学习,编程基础,开发基础,性能优化,底层开发,程序员培训
[Q]:为什么做Windows Phone开发要学好C++数据结构?
[A]:Windows Phone设备大多硬件配置有限,对应用内存和CPU占用要求高,学好C++数据结构能帮助开发者针对性优化性能,解决掉帧、闪退等实际问题。
[Q]:现在都有封装好的数据结构轮子,还要自己学吗?
[A]:现成轮子能满足通用场景,但特殊场景比如适配低内存老设备时,需要开发者根据需求调整结构,懂底层原理才能针对性优化,解决现成轮子解决不了的问题。
[Q]:为什么要用C++学数据结构,不用更简单的高级语言?
[A]:C++偏向底层,用C++学习能直接接触内存分配、指针操作等底层逻辑,能亲手踩坑理解原理,而不只是调用封装好的接口,对基础能力提升更大。
[Q]:不懂数据结构会影响开发工作吗?
[A]:做简单的业务拼版开发可能暂时不会出问题,但碰到性能优化、底层问题排查时,就会无从下手,也很难突破职业瓶颈往上走。
[Q]:Windows Phone已经停更了,学这些还有用吗?
[A]:不管做什么开发,底层逻辑都是相通的,C++和数据结构是所有开发方向的核心基础,对现在做跨平台开发、桌面开发、嵌入式开发都同样有用。
[Q]:数据结构好对求职面试有帮助吗?
[A]:大厂开发面试非常看重基础能力,手写数据结构、分析结构性能差异都是常见考点,只有真正理解原理才能通过面试,靠背代码很难过关。
[Q]:做业务开发需要学好数据结构吗?
[A]:普通业务开发确实可以调用现成工具完成,但要写出高效简洁的代码,解决性能问题,往更高层级发展,数据结构基础是必不可少的。
[Q]:学好C++数据结构对后续学新技术有帮助吗?
[A]:打好数据结构基础,再学新语言、新框架时能更快看懂底层逻辑,上手速度比基础差的开发者快很多,排查问题的能力也更强。
说回Windows Phone开发本身,当年这个系统和iOS、安卓三分天下,应用跑在限定硬件配置的手机上,资源有限得很。你写的代码多占1M内存,用户就能感觉到手机卡了半秒,掉一次帧,下次可能就把你的应用卸载了。我刚入职那会,带我的老师傅就要求我们所有人,先回去刷一遍C++的数据结构,再碰项目代码。
那时候年轻气盛,我觉得不就是几个链表、栈、队列吗?我都背过定义了,至于花一个月重新练?直到第一次做应用内的消息列表功能,我为了图省事,直接用了数组存所有未读消息。功能是做出来了,可一旦用户未读消息超过100条,滑动列表就一顿一顿的,我盯着性能监视器看了半天,才发现每次删除已读消息,数组都要整体移动元素,这一下就占了近20%的CPU。
后来还是老师傅点了我一句,换双向链表试下。我改成链表结构之后,删除操作的复杂度直接从O(n)降到O(1),滑动掉帧的问题直接就解决了,CPU占用一下子掉了15个点。那时候我才明白,数据结构不是书本上应付考试的名词,是真能解决实际性能问题的工具。
很多想学编程做开发的朋友,上来就问,现在各种高级语言都封装好数据结构了,我为什么还要自己用C++学一遍?我给大家举个最简单的例子,你开车不需要知道发动机怎么转,但如果你开的是一台有年龄的车,跑在半路上抛锚了,你懂发动机原理就能自己排查问题修好,不懂就只能等救援,错过 deadlines。
放到开发里也是一样,现成的轮子是好用,可轮子也不是万能的。你做Windows Phone应用的时候,要适配1G内存的老机型,现成的集合类可能会帮你做很多额外的扩容操作,这些操作多出来的内存消耗,在大内存设备上看不出来,放到老机子上就会让应用直接闪退。如果你自己懂数据结构,你就知道,针对这个场景,我不需要自动扩容,用固定大小的栈结构就能满足需求,省下来的内存就能给用户更流畅的体验。
而且,C++本身是偏底层的语言,你用它学数据结构,能直接接触到内存分配、指针操作这些底层逻辑,不是套个泛型接口就完事。你自己写一遍链表的插入删除,你才会明白指针指向错为什么会内存泄漏,为什么循环链表会让程序直接跑死。这些坑你自己踩过一遍,之后用任何语言开发,你都能下意识避开这些问题,而不是出了问题就一头雾水,不知道从哪查起。
我见过很多刚入行的开发,框架玩得特别溜,各种API调用顺得不行,一碰到性能优化和底层问题就懵了。为什么?就是因为数据结构的底子没打好,只学会了调用别人写好的东西,根本不知道这些东西底层是怎么跑的。比如你要做一个图片缓存功能,为什么用LRU算法效率最高?LRU为什么要用链表加哈希表的组合结构?这些东西你靠背结论是没用的,你自己用C++实现一遍,就明白为什么单种结构满足不了需求,组合起来就能把时间复杂度降下来。
放到现在来说,很多人说Windows Phone已经没了,讲这些还有什么用?其实不管做什么开发,底层的逻辑都是通的。现在做移动端跨平台开发,做桌面端开发,甚至做嵌入式开发,C++和数据结构都是核心底子。你想进大厂,面试的时候手写红黑树、手写快排都是常见题,这些东西靠背代码根本过不了,面试官一问你为什么这么设计,你答不上来直接就被刷了。
我前两年帮公司面试校招的开发工程师,碰到过一个孩子,简历写了做了好几个移动端项目,功能都做得很漂亮,我就让他说一下list和vector在插入删除的时候性能区别是什么,他说不出来,只说我知道用哪个就行。我又问他,如果我要频繁在中间插入元素,选哪个,他也说不对。其实这就是最基础的数据结构问题,哪怕你自己用C++写过一遍两种结构,都不会答不出来。
还有很多朋友说,我就是做业务开发,不需要懂这么底层的东西。确实,大部分业务开发,你调调包拼拼页面就能完成任务,可你想往上走,想做架构师,想解决别人解决不了的问题,数据结构就是绕不开的坎。同样一个需求,两个人写出来的代码,性能差个三五倍很常见,差就差在对数据结构的理解上。选对了结构,代码写出来简洁又流畅,跑起来还省资源,选错了,就是一堆bug,天天加班改性能问题。
我自己最深的感受就是,刚工作那会花了三个月啃C++数据结构,刷了近百道相关的题,这个功夫花得太值了。后来不管是做Windows Phone应用优化,还是转做Windows桌面开发,碰到性能问题,我第一反应就是是不是数据结构选得不对,一查一个准,大部分时候换个结构问题就解决了,根本不用天天对着堆内存找泄漏。
说这么多不是说让大家学开发就只啃数据结构,而是说,基础的东西一定要打牢。不要总想着走捷径,上来就学框架学速成,基础不牢,往后走肯定会碰到瓶颈。你用C++把数据结构吃透了,再学任何高级语言,任何新框架,你都能快速看懂底层逻辑,上手比别人快得多,碰到问题也比别人会解决。
毕竟编程做开发,说白了就是处理数据,你连数据怎么存怎么取都没搞明白,怎么能写出好代码呢?
Windows Phone工程师培训,C++数据结构,数据结构学习,数据结构重要性,C++学习,编程基础,开发基础,性能优化,底层开发,程序员培训
[Q]:为什么做Windows Phone开发要学好C++数据结构?
[A]:Windows Phone设备大多硬件配置有限,对应用内存和CPU占用要求高,学好C++数据结构能帮助开发者针对性优化性能,解决掉帧、闪退等实际问题。
[Q]:现在都有封装好的数据结构轮子,还要自己学吗?
[A]:现成轮子能满足通用场景,但特殊场景比如适配低内存老设备时,需要开发者根据需求调整结构,懂底层原理才能针对性优化,解决现成轮子解决不了的问题。
[Q]:为什么要用C++学数据结构,不用更简单的高级语言?
[A]:C++偏向底层,用C++学习能直接接触内存分配、指针操作等底层逻辑,能亲手踩坑理解原理,而不只是调用封装好的接口,对基础能力提升更大。
[Q]:不懂数据结构会影响开发工作吗?
[A]:做简单的业务拼版开发可能暂时不会出问题,但碰到性能优化、底层问题排查时,就会无从下手,也很难突破职业瓶颈往上走。
[Q]:Windows Phone已经停更了,学这些还有用吗?
[A]:不管做什么开发,底层逻辑都是相通的,C++和数据结构是所有开发方向的核心基础,对现在做跨平台开发、桌面开发、嵌入式开发都同样有用。
[Q]:数据结构好对求职面试有帮助吗?
[A]:大厂开发面试非常看重基础能力,手写数据结构、分析结构性能差异都是常见考点,只有真正理解原理才能通过面试,靠背代码很难过关。
[Q]:做业务开发需要学好数据结构吗?
[A]:普通业务开发确实可以调用现成工具完成,但要写出高效简洁的代码,解决性能问题,往更高层级发展,数据结构基础是必不可少的。
[Q]:学好C++数据结构对后续学新技术有帮助吗?
[A]:打好数据结构基础,再学新语言、新框架时能更快看懂底层逻辑,上手速度比基础差的开发者快很多,排查问题的能力也更强。
评论 (0)
