如何做能提升编程能力?

提升编程能力需要做好两方面的事情,一方面是打下一个良好的编程基础,另一方面是做有研究价值的实验,下面分别解释一下这两方面内容:

编程基础

编程说到底就是数学问题,程序设计就是算法设计加数据结构,所以说一个扎实的数学基础是提升编程能力的重要前提。目前计算机相关专业的课程中包括大量的数学内容,比如高等数学、线性代数、概率论以及离散数学等,只有掌握了这些内容才能在后续学习算法设计的过程中更加顺利,算法设计往往与数据结构是同步学习的,因为这两个内容存在紧密的关联关系。

另外,编程能力与操作系统、计算机网络、编译原理、数据库等基础知识也有直接的关系,尤其是操作系统的掌握情况。操作系统是程序设计的基础,掌握操作系统的体系结构以及运行方式,对于程序设计来说有直接的帮助,包括任务调度、中断处理、数据表示、事件处理等内容都是需要重点掌握的,读一下Linux系统的内核代码是一个不错的途径。

有价值的实验

做实验是提升编程能力的关键,实验的质量对于编程能力的提升有关键的作用,简单的说需要有一个逐步递进的实验过程,同一个类型的实验最好不要重复多次,因为每重复一次,通过实验获取的信息量就会急剧下降。

比如要提升Python的编程能力,早期可能需要做大量的基础性实验,在学习到中期的时候就需要给自己制定一个具体的方向,比如机器学习方向,然后就需要通过Numpy、Scipy、Pandas、Sympy等库完成具体的实验。这是一个循序渐进的过程,在学习的过程中要注意总结以及如何与具体的开发场景进行结合,只有结合到实际的开发场景中才算是真正的落地。

我做软件开发工作多年,目前也在带计算机方向的研究生,我会陆续在头条写一些关于软件开发方面的文章,感兴趣的朋友可以关注我,相信一定会有所收获。

如果有大数据、机器学习、物联网等方面的问题,也可以咨询我,谢谢!

看错东西了,你天天背诵tcp 三次握手,没用的。学习我github的36种设计模式,所有语言通用。学会后,先代码乃至写框架行云流水放荡不羁,写出的东西很有设计美感,代码行数少功能强。

关于这个问题,首先要知道什么是架构。在软件开发中,架构普遍指通过某种特定的平台,而达到完成整体软件功能的设计过程。架构是软件设计中非常重要的一个环节只要需求和架构确定之后,我们认为这个软件也就基本上可以定型了。

软件架构的主要目的是希望能重用以前的代码和设计,从而提高开发效率;在保持系统稳定的前提下,扩充功能和性能。

如何提高系统设计能力

一般而言,开发人员在从事开发3年后基本可以逐步做出初步设计,再做设计3年基本能够具备架构设计的能力。架构设计虽然高屋建瓴,从顶朝下对问题进行分解并最终解决,但是你会看到真正所有能力却是来源于你日常的编码和日常功能模块设计的大量实践积累。

当然大部分软件开发人员并一定能够在其中具备软件设计能力,这涉及到思维意识的转变问题。比如前面提到的架构要具备自动化和复用,在设计阶段要有分层、分解、抽象、聚合等思维能力。

比如一个边缘设备日志收集上报云端功能,别人告诉你采用MQ去接收日志上报到云端,你去编码实现,那么具备的是编码能力,但是你自己能够对问题进行分析和建模,参考比较各种方案后,得出采用Kafka去接收并上报日志到云端,效率最高,并最终实现,那么就是具备了设计能力。

因此在日常的编码工作中,需要刻意去培养这方面的软件设计能力。

在架构设计领域,需要站在更高的层次,你面对的是一个完整的业务系统的构建。这个业务系统包括了底层技术框架的搭建,开源组件的选择,开发框架和分层设计这些非功能性的设计内容,同时考虑如何对各种业务进行分而治之。

架构设计能力的培养,我觉得可以从如下几个方面进行:

1.务实技术基础

想要造高楼,基础必须要扎实,这里以Java为例,需要务实的基础有:Java基础、高并发、JVM优化、设计模式、数据库和索引。

现在有很多好的视频网站,能找到视频教程,比如哔哩哔哩,视频教程有个好处就是可以快进,回退,并且看起来比较轻松,我喜欢看书,书看的比较仔细推荐书籍有:《On Java》(新版Java编程思想)、《Java并发编程的艺术》、《深入理解Java虚拟机》、《高性能Mysql》、《HeadFirst设计模式》。。。。。。

一边看书,一边实战、一边记录写成博客系列教程,同时又能锻炼自己的文笔和口才,说不定还能收获一批粉丝,打造自己的个人IP,扩大自己的影响力,如果写的好的话,还能转成收费专栏,还能有一部分收入。

2.培养软件设计能力

设计能力往往就是从编码和编程思维开始的。

首先是将重复的东西自动化掉,其次是将相似的东西通过参数抽象变成可复用的方法或函数,在抽象后来实现自动化。其次就是自动化后你会发现如何更好应对变化,为了应对变化你做了更多的抽象或接口设计,在这个过程中逐步积累设计能力。这一个步骤你会发现你的就是某种设计模式来解决的问题。

其二就是编码积累到一定量后,你可以看软件架构设计的书籍,先形成设计的完整思路和方法论,也可以看设计模式类的书籍,对设计模式有一个完整的了解,能够将日常编码实践的内容和设计模式进行对比分析。这样再遇到类似的问题,你可以少走自己探索的弯路等。

但是以上也仅仅解决了设计能力的问题。

没有解决架构思维层面的问题,架构思维的核心是全局能力,是高度的抽象和建模能力,是既要清楚业务,又要懂得技术的相互衔接能力。

当然大部分架构设计人员更加热衷于开发框架,技术平台,开源组件选择等,而忽视了如何从一个业务需求的提出,你能够通过系统分析,得出整个业务系统应该如何划分模块,如何设计接口,如何设计整体数据模型和数据库来支撑业务,同时你也能够想清楚你需要遵循什么样的开发框架和模式以及分层架构来完成某一个功能模块的开发。

这个事情实际相当有难度,大部分人员不具备这个能力。

但是为何很多人架构设计还是做得不错,简单来说整个信息化和互联网发展到今天,各种业务系统,电商平台,互联网应用你基本都可以找到类似的架构参考和原型,你只需要参考别人的做法去做即可。

比如你要做一个电商平台,具体应该如何分解各个子系统,或者是否建立各个中台能力中心,这些都有标准的做法,不需要你再去创新,你只需要参考别人实践去做即可。

但是如果你面对一个全新业务,你要去规划和构建整个业务系统的架构设计,模块划分,我相信大部分架构设计人员都无法做好这件事情。这个能力已经不是简单的你技术多牛,而是考察的全局思维和系统观,考察的是分解和集成,分类和抽象,问题分析和解决,模式匹配能力,这些能力统筹我经常谈到的思维能力。

如果一个人真正具备这种独立分析和解决问题的能力,具备系统思维的能力,你会发现他不仅架构设计做得好,其它很多事情都能够很好的完成。就是这个道理。

所以要具备这方面的能力,你可以先熟悉相关的业务域知识,也可以看看完整的类似面向对象的软件架构设计书籍,领域驱动建模书籍,传统的类似RUP统一软件过程方法论等。看看完整的业务需求如何通过流程分析,用例建模,对象建模,接口设计逐步落地。

3.培养创新和激情

创新并不只是想出一个新颖的点子,创新是把点子转换成经济力量的工作,按照Joseph Tidd、John Bessant、Keith Pavitt 的理论,创新分为产品创新、过程创新、位置创新、范式创新。

  • 产品创新:改变一个单位提供的东西(产品或者服务)
  • 过程创新:改变产品或者服务生成或配送的方式
  • 位置创新:改变引入某产品或者服务的前后关系
  • 范式创新:改变单位所做业务的基础精神模型

为了能够创新,需要找到一定的边界,这能够让你有学习、适应和恢复的空间,而不必过多的关注其中产生的错误,如此让灵感变成为现实的创新产品。

保持激情能够让你感觉是在做自己的事,而不是别人让你做事,要在架构师工作中发现激情、保持激情,当激情被别人浇灭的时候,要学会重启激情,把难事做好,尽心尽力投入,用激情作为前进的动力,同时坚持锻炼,这样才能一直在架构师的路途上不断走下去,成为一名出色的架构师。

以上内容分享自华为云社区《【云驻共创】怎么提高自己的系统设计和架构理论水平》,作者:阿提说说。

唯一的捷径就是:实践、实践再实践。

计算机语言编程跟我们学习英语、婴儿学说话一样,多练,多说,接触得多了,慢慢就熟悉,精通。

学一门英语,学到最后,你会发现,真正的融会贯通,还需要学习他们的思维方式、文化背景。

同样地,学习计算机语言编程,也需要你对计算机原理、程序的编译链接、IT知识体系有有一个基础,这样你才能编出高质量的代码。

1、学好 C 语言。建议一定要学好 C 语言,它应该作为你必须掌握好的语言。你要熟悉 C 语言的基本语法,包括:

  • 顺序、条件、循环三大控制语句
  • C 中几大基元数据类型的用法
  • 熟悉掌握数组的用法
  • 熟练掌握指针的用法
  • 熟练掌握结构体、枚举、联合等数据类型的用法
  • 熟练使用常用 C 库函数,如控制台输入输出流、字符串操作、文件操作、时间函数等等

2、熟悉 C/C++ 语言相关的开发工具链。无论你的理论知识学的多么麻溜,连代码写在什么地方、如何编译、如何调试和运行都不知道,一切都是水中月镜中花。所以掌握 C/C++ 语言相关的开发工具链你才能不断练习,提高动手能力,我们学习开发最终是为了付诸实践的。熟悉 C/C++ 语言的相关的 IDE 开发环境,Windows上我推荐 Visual Studio,Mac 上可以使用Subline 或者VSCode,如果你最终的程序需要在 Linux 跑,你需要熟悉 cmake/make/gcc/g++/gdb 工具链,vim 的基本操作也要熟悉,但绝对不要直接在 vim 中写代码,纯属浪费时间,实际企业级开发也没人会这么做。这里强调一下,如果可能,至少要熟悉 Visual Studio 和 gdb 调试。

3、编程语言方面学好 C++ 本身。学习的阶段,请抛弃各种总结经验技巧的面经,逐个掌握 C++ 语言的各个语法,包括但不局限于:指针和引用的概念指针与内存关系程序编译过程,静态链接库和动态链接库static、const、#define的用法和区别C和C++区别内存中的栈和堆分配面向对象理解访问限定符 public/protected/private构造函数/析构函数/拷贝构造多态虚函数与纯虚函数、虚函数实现机制、虚函数表继承原理、虚继承、菱形继承new/delete和malloc/free重载、重写和覆盖类型转换方式RAII 与 pimpl 惯用法内存溢出和内存泄漏STL标准模板库迭代器、空间配置器理解常用容器特点、用法以及底层实现vector、list、deque、set、map、unorderedmapC++11/14/17 新标准也慢慢成为主流,这块也要熟悉,要熟悉新标准常用的语法与新功能,包括:另外,时至今日,你一定要熟悉 C++11/14/17 常用的语言特性和类库,这里简单地列一下:左值/右值/std::move/std::forward统一的类成员初始化语法与 std::initializer_list注解标签(attributes)final/override/=default/=delete 语法auto 关键字Range-based 循环语法结构化绑定stl 容器新增的实用方法std::thread线程局部存储 thread_local线程同步原语 std::mutex、std::condition_variable 等原子操作类智能指针类std::bind/std::functionC++11/14 网上的资料已经很多了,C++17 的资料不多,重点掌握的还是 C++11 引入的各种实用特性,这就给读者推荐一些我读过的书:《深入理解 C++11:C++11 新特性解析与应用》《深入应用 C++11:代码优化与工程级应用》《C++17 完全指南》《Cpp 17 in Detail》

4、学好算法和数据结构。开始学习算法和数据结构时,一定要找一两本经典书籍系统地学习下常见的算法理论、思想和常用的数据结构知识。等熟悉了这块的知识,再适当地刷一些算法题目或者做一些算法练习。学习算法和数据一定不能急功近利,算法和数据结构的知识一定要作为一个长期的学习目标。

5、注重代码规范与风格优化。在你学习的过程中,请一定要认真对待自己每一个变量名、函数名,养成良好的代码习惯。还是个小白的时候,要认真精读一些优秀代码,不仅要学习它们的整体设计思路,还要学习它们的代码风格和细节。这里推荐《程序设计实践》《代码整洁之道》这两本书,特别是《程序设计实践》,强烈建议学生朋友看一下,能大幅度地提高实际编码的技巧和编码风格。

相关代码参考