How to start a Project from Zero

介绍

  • 如何从0开始完成一个项目?这是我在学习过程中遇到的一个难以忽视的问题。这篇文章将会包含如何去开始一个项目,如何去维护一个项目的记录。不过这些想法没有经过认证,仅仅是对于开发过程中的思考方式的归纳和总结。
  • 开发的范式很难总结出来,因此我将尝试分析我在一门程序设计专题课最后的大作业开发流程,通过完善这个远古项目开发的过程,来帮助构建一个开发的范式。
  • 这个项目采用C和visual studio2017开发

项目介绍

  • 项目的名字叫做"排序可视化",要求我们小组实现常见排序的可视化展示。

  • 项目的实现需要借助学校里一个老掉牙的图形库,该图形库为我们封装了某些图形的画法,还有windows窗口的生成等等

  • 这个项目按理来说是简单的,但是还是有一些刚开始难以思考的要素,比如说Windows,比如说图形化,这样就不够把最需要关注的点显露出来,因此我想在另一篇文章中选择一个要素最为稀少的项目,也就是使用C/C++和文本编辑器开发的在Linux平台上运行的控制台应用程序,来阐述我认为的项目开发思路。

准备工作

  • 单拎出来一个排序可视化,我们如何使用我们手上零散的开发经验和工具,将这个项目有序地进行下去呢?这是一个很重要的问题,大家都没有开发经验,大家都是小白,但我们却要去完成一个"黑箱",而这个黑箱居然能够实现排序可视化的功能,我们很兴奋,但是也不知道从何开始。

  • 作为组长,我说了句令人信服的废话:大家去学习一下什么是排序。于是我们组员花了一周时间学会了冒泡选择插入归并等排序算法。

  • 我又说,要用学校里这个很烂的图形库,大家把画图的函数都看看,熟悉一下图形库。于是组员们又花了一周时间,把这个老古董啃了一遍。

  • 但是怎么开始呢?我们回去个人单干了一星期,在我偷懒的时间里,有组员的排序可视化已经初具雏形,我很高兴,遂召集大家开会,商量如何在这个雏形上完成我们的项目,但是一开会我们发现了一个问题,程序在main.c里面,要分模块很难,这对后来的模块划分还有模块添加造成了麻烦。

  • 于是我尝试去划分模块,但是没能成功,于是这次我从头文件的建立开始,自己写了一大堆代码,但是每个模块都分成小块放在一个文件里,把每个功能模块划分好,最后也完成了一个雏形,收获了组员们的一致好评。

  • 这是我们在毫无经验的情况下摸索出来的准备工作过程,其中不乏有些不成熟的地方,但是可取之处也是不少,下面是我后来的一些反思和经验。

我们的项目是什么

  • 这是一个我当时从未思考过的问题,后来我觉得这是十分重要的,明白一个项目是什么,是避免成为无头苍蝇的第一步。

  • 我们的项目是一个借用第三方图形库,使用C语言和visual studio2017开发的在windows平台上运行的图形化应用程序。

  • 这句话的含义现在看来十分丰富

编程语言
  • 编程语言的选择有很多,比如C、C++、Python、Java、Rust等等

  • 编程语言应当发挥它的长处,为项目提供开发效率的提升、安全性的提高、可读性的增强、运行速度的提升这些好处

  • 由于课程要求,本项目只能使用C开发

IDE
  • 集成开发环境(IDE)为我们省略了大量环境搭建的过程,极高地提升了开发速度,但是我们是需要对项目的编译、调试过程有所了解的,这也又助于我们更好地使用IDE,环境搭建的具体过程将在后文叙述

  • IDE的选择很多,有VS,CLion,IDEA,Pycharm等

  • 要想了解IDE的环境搭建过程,必须对特定语言的特性和编译(解释)方式十分了解

运行环境
  • 运行环境在我的理解下应该指的就是操作系统,应用程序使用操作系统提供的API和文件系统等,程序应当保证对特定操作系统的兼容性

  • 有一个例外是操作系统的编写,操作系统的内核本身应当是机器有关的,可以认为,操作系统内核由机器架构提供环境,而应用程序由操作系统提供环境

程序类型
  • 本项目的类型是图形化应用程序

  • Windows上的程序类型应该还有控制台应用程序等,更多的细节需要对Windows更加了解

相关背景知识

  • 由于很难一开始就对某个领域的细枝末节了解的十分清晰,在面对一个新项目时,我们需要获取项目相关的背景知识

  • 比如说这个项目有关排序和可视化,我们就要去了解排序相关的知识和图形库相关的知识

  • 如果这个项目有关操作系统,那么我们就要去获取操作系统的设计和机器架构相关的背景知识

  • 甚至当你在开发过程中也会遇到语言语法的卡壳,这时候一份C语言参考文档就十分重要

  • 可以自己整理一套自己的常用开发参考,在必要时使用stackoverflow或者是ChatGPT

项目大纲

  • 后面我又说,过几天开个会,把项目的模块分一下,前面的指挥调度已经建立了我组长的威信,组员们纷纷相信我的胡言乱语,于是我们花了一个下午的时间,给项目弄了个思维导图。

  • 项目的大纲是重要的,因为各种模块的解耦是如此地困难,从刚开始就有一个大体的框架和划分模块的意识是必要的

大纲成为框架

  • 大纲的代码化就是项目框架,如何编写一个好的框架至关重要,但是我也不会。根据我的经验来说,框架要满足的要求是,划分好独立的模块,能够提供添加模块的接口和去除模块的方法。

  • 项目框架不是完美的,好的框架可以一定程度上减少解耦的工作量,但是解耦在项目开发的过程中仍然是必不可少的。

  • 仅仅在这个项目中,我觉得框架就是写好各个模块的头文件,然后以main.c开始,用树形结构确定每个模块的依赖关系,再写好相应源代码的头文件调用。相互独立的模块或者相互传递数据的模块表现为同一辈分,而依赖于子模块功能的模块则表现为父节点。

环境搭建

  • 老师直接推荐IDE VS2017开发,我们当时对环境搭建也是一点不懂,IDE很好地处理了这项工作,但是我们在提交时在想,别人怎么看到我们最后展现出来的成果,我们提交的项目只有代码,别人应该怎么运行它。组员甚至问了一个问题,解决方案平台里面的Debug和release是什么意思,x86和x64又是什么意思,我摇摇头,因为我也对此一无所知。

编译器

  • 对于C语言的项目来说,掌握CALL的文件编译过程十分重要,分别是编译器把C语言转化为x86的汇编形式,汇编器把汇编形式转换为二进制形式,链接器处理好各对象文件的关系,执行器负责执行程序。

  • 编译过程有很多的编译器软件开发包可以完成,比如说gcc,clang,在win平台还有MinGW,VS2017使用的应该是MSVC工具链,包括常用的编译器和调试器工具

构建工具

  • 使用Make或者CMake,自己使用Make是明白一些IDE大型项目的构建过程的开始,另外多阅读其他项目的Makefile也有助于理解构建过程

环境变量

  • 环境变量是操作系统用于控制运行环境的参数

团队开发

  • 后面我们进入了愉快的写模块环节,期间我们遇到了一个问题,每个人都改代码,怎么一起开发呢,本来组员说用LiveShare,后面没搞成就变成群里发压缩文件了。这样的结果是在同一时间段我们还是只能有一个人修改。所幸最后是成功完成了。

注释

  • 注释和变量命名无论是对单人还是多人开发都是很重要的,写好函数接口的注释无论对其他的贡献者还是后来的你都是大有帮助。

版本控制

  • 应该使用git/github多人工作流。

调试

  • 用GDB或者IDE自带的调试器

运行维护

How to start a Project from Zero

http://huaeryi.com/2023/04/24/Zero-Project/

作者

huayi

发布于

2023-04-24

更新于

2023-04-25

许可协议