随想录(软件开发不能是加工作坊)

2024-03-08 09:18

本文主要是介绍随想录(软件开发不能是加工作坊),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

   前一段时间看了一本《走出软件作坊》,心情很沉重。不管你是否承认,书中描述的情况在现在的国内IT企业中确实存在,可能涉及的范围还很广。联想到自己目前处于的行业,心中不免唏嘘不已。类似的事件,类似的方法,每天都在上演着。无休止的版本修改,无休止的测试,无休止的开发需求,人员的流失和更替,心中除了累还是累。现在的IT早已经不是10年前的香饽饽行业,大家都在经受着挑战和煎熬。现在的IT行业分布很广,IT信息化公司、网站公司、通信公司、嵌入式产品公司、芯片公司、网游公司、ERP公司,这些公司由于所处行业的上下游位置不同,公司的境遇差别很大。特别辛苦的是那些本身技术门槛比较低,缺少技术壁垒的公司,员工在承受着低福利的同时还要承受着与之不匹配的工作强度。这就是我们的生活现状。我们的IT开发非要这样不可吗?


    一般认为,IT项目开发的过程都是按照需求分析、软件设计与实现、集成测试与系统测试、后期维护这几个步骤进行的。我们应该好好反思一下,这几个步骤有没有提高和改进的空间。


(1)加强需求分析

    从商业的角度来说,交易的出发点就是为了满足客户的需求。只有精准地满足了客户的需求,我们才能更好地交付产品,实现双赢。当然,完成这一切的前提就是需要我们能够准确把握客户的需求。对很多公司来说,需求分析都是由销售来说,这是十分不靠谱的一个举动。因为,我们知道,销售人员的目标就是完成更多的签单,所以很多时候他会毫无原则地接受客户的一切要求。至于这些要求客户是不是真实需要,或者说这些需求本身技术能不能实现,那就超过了他本身的理解范围了。很多销售的理解范围其实就是入职时培训的那一些内容,至于技术细节或者产品性能方面的东西,那真是无能为力了。作为优秀的需求分析师,他不仅仅可以准确把握客户的需求,甚至在某种程度上可以影响客户的需求。这种例子虽然不多,但是也不鲜见。无原则的接单,不仅浪费了开发的资源,从大了说,也会影响公司的诚信水平,甚至危害公司的发展。


(2)抽象公共平台

    现在的服务器系统平台很多,windows可以,linux可以,unix也可以。因此,很多情况你不知道自己的服务端程序最终跑在哪一个操作系统上。所以,你要做的就是做一个抽象的公共平台。在这个平台上面,你可以忽视具体的细节,因为你使用的函数都是平台的函数,你使用的数据类型都是平台的数据类型,所以不管什么操作系统,你的服务器程序都可以准确无误地运行。为了做到这些,你可能在构造平台的时候需要对很多函数重新进行封装,比如,

a)内存申请、释放

b)socket创建、接受、发送、释放

c)信号量操作

d)文件创建、打开、读、写、关操作

e)定时器

f)消息发送和接受

g)延时函数

h)线程创建、优先级设置、属性设置、属性获取等等


(3)构建自己的软件库

    软件作为一个工程来说,事实上它也是由很多的子模块组成的。这里面的模块很多,比如说基本算法模块、数据库访问模块、图形模块、解析模块、日志模块、解压缩模块、pic读取模块。对于很多项目来讲,很多模块的功能都是可以复用的,那么如何把这些模块抽取出来就是我们需要完成的一个工作了。最最理想的情况就是,我们所有的软件都是由各个模块按照搭积木的方式组成的,如果我们需要对应的功能,那么打开对应的编译宏就可以了;反之,如果不需要这个功能了,那么关闭对应的宏即可。这方面,我们可以看一下linux代码。它上面的很多代码都是以模块存在的,那么多cpu、那么多fs、那么多chip都可以在上面运行,这说明linux整个系统的设计是非常开放和健壮的。


(4)抽象流程

    作为一个软件的主流程,这好像应该是软件主程序员应该负责的事情。其实,作为某一个模块的程序员,我们也可以从中学习到一些东西。就拿我经常说的一个例子来说,假设现在我们需要设计一个音频播放器,它需要支持mp3、wav、ogg等多种音频格式文件。看到这里,大家可以先考虑一下,这个软件应该设计?在这个地方,我们应该思考一下,所有的文件操作有什么共性的地方,能不能在各种音频文件之上构造出一个通用的文件访问流程。有了这个抽象的访问流程之后,那我们对各种音频的处理就是一个简单的注册和解析工作了。即使我们写的程序不正确,也不会影响原来主流程的运行过程。有了这一层抽象之后,可以极大提高我们工作的开发效率。


(5)单元测试

    单元测试是一种非常好的方法。本质上说,代码设计者应该是代码的最终负责人。可是在实际工作中,我们把软件的质量问题过多地放在了测试人员身上。好多人认为软件测试是一个非常无趣且单调的工作。其实,情况并非如此。对于功能性测试,我们应该尽可能采取自动化测试的方法,实现版本的每日构造和每日冒烟测试。而对于模块的测试,那就要进行代码的单元测试。就我个人的经验而言,如何设计stub函数,如何设计单元测试是非常考验人的一件事情。随着单元测试用例的增加,我们的代码会越来越健壮,整个模块也会越来越稳定。可是在很多公司,单元测试做的很不足,或者说很多公司干脆彻底就不做了。


(6)自己编写测试工具

    平时测试软件的时候,我们的方法其实不多。有的人习惯使用windows的性能分析工具,或者如果公司比较富裕一点,会自己购买pure coverage等工具。但是,其实很多时候我们是可以自己编写测试工具的。这些工具的编写不复杂,比如说

a)可以利用malloc重定向的方法,统计malloc的内存个数,看看内存有没有泄漏

b)利用开源工具gcov测试代码覆盖率

c)自己编写脚本解析模块,灵活地对代码功能进行测试

d)利用assert属性,捕捉一切异常的属性等等


(7)仿真工具

    在嵌入式开发中,实际环境常常是非常有限的。所以,创建一个有效的仿真平台是什么重要的。就拿android来说,我们就是在windows上面开发一个android的仿真环境,那么app的开发者就不需要每次开发一个版本之后,到实际phone上下载之后才能看到实际的运行结果。有了pc的仿真之后,他在pc上看到的结果基本上就是在phone上看到的效果。这中间没有别人的打扰、没有实际环境的搭建,工作的效率自然而然就可以提高上去了。当然不仅GUI可以仿真,原则上只要不和具体硬件相关的操作都可以而且应该放在pc上来解决。


    上面很多的内容都是我个人的一些总结和意见,欢迎朋友们多多交流看法。


这篇关于随想录(软件开发不能是加工作坊)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/786643

相关文章

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

解决Office Word不能切换中文输入

我们在使用WORD的时可能会经常碰到WORD中无法输入中文的情况。因为,虽然我们安装了搜狗输入法,但是到我们在WORD中使用搜狗的输入法的切换中英文的按键的时候会发现根本没有效果,无法将输入法切换成中文的。下面我就介绍一下如何在WORD中把搜狗输入法切换到中文。

【经验交流】修复系统事件查看器启动不能时出现的4201错误

方法1,取得『%SystemRoot%\LogFiles』文件夹和『%SystemRoot%\System32\wbem』文件夹的权限(包括这两个文件夹的所有子文件夹的权限),简单点说,就是使你当前的帐户拥有这两个文件夹以及它们的子文件夹的绝对控制权限。这是最简单的方法,不少老外说,这样一弄,倒是解决了问题。不过对我的系统,没用; 方法2,以不带网络的安全模式启动,运行命令行,输入“ne

代码随想录训练营day37|52. 携带研究材料,518.零钱兑换II,377. 组合总和 Ⅳ,70. 爬楼梯

52. 携带研究材料 这是一个完全背包问题,就是每个物品可以无限放。 在一维滚动数组的时候规定了遍历顺序是要从后往前的,就是因为不能多次放物体。 所以这里能多次放物体只需要把遍历顺序改改就好了 # include<iostream># include<vector>using namespace std;int main(){int n,m;cin>>n>>m;std::vector<i

代码随想录打卡Day25

今天一整天都在教研室做实验,没时间刷题,就做了一题,剩下的明天补 491.递增子序列 这道题目和之前的子集问题很像,但是有一点要注意的,这个输入的数组不能进行排序,所以就不能沿用之前的去重逻辑,这道题要去重还是得借助额外的变量来维护元素使用情况,但是这题的used为集合,且不能为全局变量,只能为树层遍历前定义的一个局部变量,除了这个改动以外,其他地方都是高度相似的。 class Soluti

为什么构造函数不能为虚函数

1,从存储空间角度     虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。 2,从使用角度         虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调

【软件工程】软件开发模型

三、瀑布模型  四、几种软件开发模型的主要特点 题目 判断题 选择题 小结

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II 1.题目 1.1递增子序列 题目链接:491. 非递减子序列 - 力扣(LeetCode) 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0491.%E9%80%92%E

代码随想录算法训练营Day37|完全背包问题、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯(进阶版)

完全背包问题                  和01背包最大区别就是一个物品可以重复放多次,因此遍历空间时可以从前往后。 import java.util.*;public class Main{public static void main (String[] args) {Scanner sc = new Scanner(System.in);int m = sc.nextInt

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II 1.题目 1.1复原IP地址 题目链接:93. 复原 IP 地址 - 力扣(LeetCode) 视频讲解:回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0093.%E5%A4%8