知乎千万浏览你的编程能力从什么时候开始突飞猛进(自学C语言MSDN这个玩意查查询各种函数的用法)Windows程序设计《Windows核心编程》深入浅出MFC是GUI编程的三大神作
(自学C语言MSDN这个玩意查查询各种函数的用法)Windows程序设计《Windows核心编程》深入浅出MFC是GUI编程的三大神作
https://m.toutiao.com/is/JKJS2Gp/
◇◇◇
1、第一次编程能力突飞猛进,是在记住300多个函数之后。
我是2005年初自学C语言,然后找到的第一份软件开发工作,开发Windows 98上的宽带接入客户端。
C语言里没有图形界面的东西,要做GUI应用,得调用Win32 API或者使用MFC,我是一概不懂,所以一开始就比较懵逼,不知道从何入手。后来在老司机指点下,买了Windows GUI编程的三大神作——《Windows程序设计》、《Windows核心编程》和《深入浅出MFC》。然后,白天在单位老司机指点下写代码,晚上回到租住的地方啃书,写测试程序。周末没事儿也都在啃书,写程序。
很快把这些书里与工作相关的内容都啃了两遍,但工作起来,还是有一个障碍——面对某个功能,想不到用什么模块什么函数去实现。
嘿嘿,这个是很多初学者都会碰到的鸿沟,浮光掠影学了不少东西,真动手时,想不到该用哪个。
怎么办呢,问同事。比如问“怎么创建一个窗口”,他会告诉我,“用CreateWindow”。再问,“这个函数怎么用?”他会告诉我,“去查MSDN”。
于是我就知道了还有MSDN这个玩意儿,下载下来,没事儿就找函数,看它的用途,记它的参数。
大概两个月后,我记住了几百个函数,什么CreateWindow,CreateWindowEx,BeginPaint,DispatchMessage、SetWindowLongPtr、RasDial、CoCreateInstance、timeSetEvent、DirectDrawCreate、CreateSurface……都深深地印在了脑海里。
于是,奇迹出现了:每当要实现一个什么功能,我就能直接想到用什么方法,然后一查MSDN,很快就搞定了。
再接下来,身边的老司机想不起来哪个功能对应哪个函数,也会问我,我可以迅速说出函数名字和参数以及返回值。
那段时间的感觉,特别棒,好像跨过了一道坎,一下子能轻松搞定工作了,一下子在团队里有了价值。
这也是这段经历,过去了十几年,我还印象这么深刻的原因。
这段经历也让我意识到:记忆API,理解API,建立API和应用场景之间关联词典,是学习一种新的开发技术的基本功。
所以后来再学到Qt、DirectShow、D3D、ffmpeg、WebRTC、Skia等技术时,我如法炮制,下一番笨功夫,然后很快就可以用起来。
◇◇◇
2、第二次编程能力突飞猛进,是在读完Qt源码之后。
有一段时间用Qt写网络程序,用QTcpSocket从服务器接收数据,遇到一个问题——程序运行时经常出现内存溢出导致的崩溃。
查来查去,不知道怎么回事儿,分配内存和释放内存都是结对的,没有明显的内存泄漏,后来用valgrind启动程序检测,在一堆内存问题中,也没找到自己代码有内存泄漏。
没办法,就去读QTcpSocket和QAbstractSocket的源码,还读了封装起来的平台相关的网络实现,后来发现,socket里面有一个buffer,是会动态增长的,你不停的塞数据,它就不停的分配内存,永不停歇,直到溢出崩溃。
然后就顺着这个线索往应用层面回溯,发现Qt实际上提供了一个设置缓存大小的方法,调用了一下,问题果然就好了。
后来这个程序又遇到了性能问题(当时在128M内存的电视盒子上开发),还是读源码,找到了怎么减少内存拷贝次数的解决方案。
这次经历后,我就开始系统阅读Qt源码,把几个核心模块,Qt Core、Qt Network、Qt GUI、Qt多线程等,都通读了一遍。
读完之后就发现,哎哟,之前开发中遇到的各种疑难技术问题,都能手到擒来解决掉了。甚至我还基于那个128内存盒子厂家提供的图形API,写了一个桥接Qt和盒子显卡的驱动模块,让整个盒子的图形性能获得了大幅提升。
再后来,因为对Qt的系统理解,我就写了两本Qt开发的图书,《Qt on Android核心编程》和《Qt Quick核心编程》。
这段经历让我意识到,阅读开源框架的源码,理解开源框架的设计原理和实现细节,根据自己的应用场景定制、扩展框架,是从一个API Caller变身特定方向精通者的必经之路。
再后来,我在项目中引入开源类库,都会找时间去读它的源码,像ffmpeg、mplayer、vlc、WebRTC的源码,我都读过。