除了刷题之外的事 - Software Engineering

除了刷题之外的事

「程序设计」的练习是一种从「写得出」程序到「写得好」持续迭代的优化过程,在 LeetCode 刷题的过程中我们掌握的是「解决问题的能力」,特别是指所谓的程序问题(或是演算法问题)。解决程序问题的能力主要是把原始的问题转换成一个程序可以解决的问题,再进一步把大问题拆解成小的问题或是转换成其他较容易解决的近似问题。不管怎麽说,我们在刷题过程在意的是 理解拆解实作 的步骤。刷题其实很类似国高中数学的应用问题,给你一个情境或是问题,理解之後转换成对应的题型与章节,然後挑选正确的理论或是公式解题。在解决数学应用的过程不是死背公式,而是从大量的练习题当中掌握公式的用法;就如同写程序一样,刷题不是要你被题型或样板,而是累积对於类似问题的解法与武器。

刷题是练习 解决问题的能力 的一种方法,而这里的「问题」主要是指 演算法问题 。但在实务的工作场景当中,「演算法问题」只是程序工作的一小部分而已。我们除了在意「一个问题中的算法怎麽解之外」,我们更在意的「如何把这些算法实现成完整的应用」。因此除了刷题之外的事是如何用「工程化」的方式解决一个真实问题,除了刷题之外想写好程序还有以下几个技能需要掌握:

  • 软件工程 (Software Engineering)
  • 专案管理(Project Management)
  • 系统架构(System Architecture)

浅谈软件工程

什麽是软件工程?

根据 维基百科 的定义:「软件工程(software engineering),是软件开发领域里对工程方法的系统应用。电气电子工程师学会(IEEE)给出了一个更加综合的定义:『将系统化的、规范的、可度量的方法用於软件的开发、执行和维护的过程,即将工程化应用於软件开发中』」

软件工程是一种系统性开发软件的过程与规划,而这个开发进程可以分成分析、设计、实作、测试与维护这四个阶段,称为是「软件生命周期」。换句话说,软件工程告诉我们要依循怎样的规划与协作才能够让软件开体的过程更顺利。

什麽是设计模式?

根据 维基百科 的定义:「在软件工程中,设计模式是对软件设计中普遍存在的各种问题,所提出的解决方案。设计模式并不直接用来完成程序码的编写,而是描述在各种不同情况下,要怎麽解决问题的一种方案。」

设计模式强调软件或程序开发中的「设计」该如何设计,设计模式是一种如何开发「好的程序」专案的一套经验,其涵盖的范围会包含整个程序的开发到维护。总结来说,演算法着重的程序片段、设计模式通常是一个或多个程序之间要如何协作,软件工程更上层的从专案的角度来规划,如何去管理与开发整个专案从零到一。

敏捷开发

软件生命周期

一个软件从无到有开发过程我们称为「生命周期」,大致上会包含「分析」、「设计」、「实作」与「测试」,有些人也会加上「部署」跟「维护」。常见的开发方法可以分为「瀑布模型(Waterfall Model)」或「敏捷开发(Agile Development)」,如 下图 所示:

瀑布模型与敏捷开发

瀑布模型会依照不同的阶段来规划,前面一个阶段完成後才会进入下一个阶段(除非前一个阶段完成,否则下一个阶段就无法开始)。相对来说,每一个阶段投入的时程与成本都会提高,但随之而来的风险也会提升。敏捷开发是近年来很热门的一种软件开发方式,更强调的是「小规模」的开发与验证。过去瀑布模型最大的问题在於庞大的规划难以迅速地因应使用者或是市场需求的变化,缺乏面对不确定性时的弹性。而敏捷开发则是把整个开发流程拆成小阶段的进行,相对来说比较轻量,每个回合着重在小功能的「分析」、「设计」、「实作」与「测试」,透过不同回合迭代出新的功能。


嗨,大家好!我是维元,一名擅长网站开发与资料科学的双栖工程师,斜杠於程序社群【JSDC】核心成员及【资料科学家的工作日常】粉专经营。目前在 ALPHACamp 担任资料工程师,同时也在中华电信、工研院与多所学校等单位持续开课。拥有多次大型技术会议讲者与竞赛获奖经验,持续在不同的平台发表对 #资料科学、 #网页开发 或 #软件职涯 相关的分享,邀请你加入 订阅 接收最新资讯。


<<:  初学者跪着学JavaScript Day27 : 渣男给不完的promise

>>:  [Day 27]从零开始学习 JS 的连续-30 Days---BOM-浏览器物件模型(上)

Day 1:为什麽工程师要建立自己的技术部落格?

大家好我是 Gui,一名刚於私立科大资管系毕业的社会新鲜人,这是我第一次参与 IT 铁人赛,既紧张又...

[FLM] Genero的License授权

今天谈点轻松的,Genero的 License Genero Package在销售上并不是如同 J...

Webpack 笔记三(webpack loader dev server)

dev server 利用 source-map 可以更好的 debug 如果我在程序码里面加入一个...

[Day6] Vector 使用 以及 回圈更深应用

今天的内容可能有点杂 进度好慢 zzzz 昨天讲到 for loop 但是正常人都不会只是像昨天那样...

利用谷歌提供的插件彻底解决Chrome隐藏WWW和HTTPS问题

谷歌官方多年前推出可疑网址报告这个扩展程序,原本这个扩展程序是帮助用户检测恶意网站和反馈恶意网站的。...