V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
niceyuri
V2EX  ›  分享发现

[萌新上路] 远程工作的技能储备:我是如何学会写代码的

  •  1
     
  •   niceyuri · 2023-02-24 11:39:01 +08:00 · 1028 次点击
    这是一个创建于 672 天前的主题,其中的信息可能已经有所发展或是发生改变。

    由于工作内容和形式的关系,当前的远程工作的一大部分都是开发者。作为一个非科班出身的小白,笔者是如何熟悉并逐渐了解开发这个技能的呢?且听道来。

    起源于和一个多年的大手子开始学习 Web 应用开发,发现学习的难度曲线非常平滑,远胜于之前自学的盲目求索。故而笔者总结了学习路径,分享给一些像我一样的萌新。

    如下文,会分成「内功」和「招式」两大块。

    字数:3608 ,预计花费 12~18 分钟

    开始之前

    物有本末,事有终始。知所先后,则近道矣。——《大学》

    和人说「我想学写代码」,就和直接说「我想赚钱」差不多,属于情绪的释放表达,并不是真正意义上的想学。

    明确最终目的,才知道达成这个目的要做哪些事情,安排好优先级后,剩下的交给时间。

    笔者在从前所谓的“学编程”过程中,学习路径往往是:

    B 站找视频——了解一门编程语言——依样画葫芦——信息量太大,困了——放弃

    在过去的数年中,无数次的选择了放弃。直到这一次,大手子问了我一个很明确的问题:

    别和我说想学编程,你得告诉我你想用编程来干什么!!!

    而编程能干什么?大概有以下的分支:

    1. Web 浏览器上的应用开发
    2. APP 开发(分安卓平台和 iOS 平台)
    3. 嵌入式开发(比如各种电子设备,了解不多不赘述)
    4. 桌面端软件开发(基于 Windows 、MacOS 、Linux 等桌面端的软件)
    5. 自动化的脚本(比如办公自动化的一些简单编程)
    6. 其他....

    而笔者根据需求,选择了「 Web 应用开发」这个分支,接下来大手子就开始安排课程了。

    内功

    面向对象设计

    在开发应用的过程中,首当其冲的问题就是「理解需求」。也就是:

    把用户提出的对于应用开发的自然需求,翻译成「技术需求」。

    而大手子的第一课,就是教我如何把一个一个的「需求」,分解成若干个代表特定角色与职责的类或者对象(实例化的类),并在其中封装功能。

    这个过程,在熟练的程序员编码时几乎不需要专门花时间,一眼就看出来了(大手子原话)。但是这却是推开大门的基石。在这里,推荐一本很好的面向对象入门教程:《 The Object Primer 》,作者 Scott W.Ambler 。有中文版的。

    结构化代码

    在开发应用的过程中,维护过去的代码的时间将远远超过编写新的代码的时间。尤其是并非单兵作战,在一个团队中和大家一起开发的时候。在这个情况下,编写整洁、容易理解的代码(而不是仅仅依靠长篇累牍的注释)就显得尤为重要。这个技能可能并非你生产力的直接体现,但却是作为程序员的一个基本素养(大手子原话)。在这个领域也有一本非常好的教程:《代码大全》,作者 Steve McConnell

    算法和数据结构

    关于这个领域,听一些程序员小伙伴介绍,是一个开发者真正开始登堂入室的门槛儿。简而言之呢,通晓了一些算法和数据结构之后,就能站在巨人的肩膀上,按照前辈的智慧去迅速优雅地解决一些可能非常困扰我们的问题。各种技术栈可能会随着时间的推移而逐渐更新迭代,算法则不然,有很多经典的算法甚至是数十年前的产物,也是程序员可以真正积累的“内功”。关于算法和数据结构,笔者没有非常深入的去学习掌握,目前在看的就是《大话数据结构》,作者程杰,还有《算法图解》,作者 Aditya Bhargava 。

    如何检索需要的信息

    内功的这一步,看起来和编程没有什么关系。实则非常非常重要。在实现功能的过程中,绝大多数时候是没有一个大手子在现场教你怎么一步一步解决的。感谢互联网信息和搜索引擎的发展,目前获得各种信息的渠道比较多且便捷。如何在海量的信息中找到正确的解决方案,也就成为了一个非常重要的技能。一个检索信息的简单可靠性优先级排列为:

    该技术栈的官方文档(或者 Github 中的 Readme )——ChatGPT——Google 英文结果( StackOverFlow 等)——Google 中文结果——baidu 开发者搜索——baidu

    当然,上述只是一家之言,大家可以根据需求自取。

    敏捷开发方法论

    现如今,越来越多的项目采用了「敏捷开发」的方式,而对于开发者而言,了解一些没什么坏处。虽然目前很多团队还是半像不像的「中华田园敏捷」,不过好歹也在转变的过程中。

    大手子采用的是一种叫做「极限编程」的实践,简单而言就是先把需求分解成一个一个很小的「 Story 」,然后根据它们设计接口。我写代码时他远程瞧着,然后他写另外一部分接口,我围观。具体的细节有一本很好的教程 《敏捷建模》,作者 Scott W.Ambler 。有中文版的。

    当然,敏捷开发方法论目前已经百花齐放,流派众多,想要了解的小伙伴多的话,笔者专门开个帖子。

    招式

    掌握一门编程语言

    内功走了一定基础以后,就要开始实践了。在实践中验证认识,再根据实践中遇到的问题不断去提升认识,这样能形成一个巨大惯性的飞轮,越学越轻松,越学越快。

    根据笔者学习 Web 应用开发的目标,大手子教我从 Ruby 开始。

    框架和栈

    拿盖房子举例,我们会采用大量的机械,比如挖掘机,塔吊等等,而不用一个螺丝一个螺丝地去先造出来机械再去盖楼,效率很低很难。框架它定义了软件组件之间的关系、架构、流程和规范。提供了一些基本的功能和接口(也就是我们的挖掘机和塔吊),开发者可以在此基础上进行扩展和定制,从而快速地构建出复杂的软件系统。

    而栈,就是关于实现目标(比如要开发一个 Web 应用)需要用到的框架(包括前端框架和后端框架)、编程语言、数据库软件等等,都可以叫做栈。比如常用的 MySQL ,就是一个栈。

    笔者在这里有点特殊,并没有从 Ruby 最经典的 Rails 框架入手,大手子选择了一个非常轻量的框架 Sinatra ,按他的话来说:

    框架的用处,通常是把需要你手工的过程自动化。但是对于萌新而言,在自动化某一个过程前,必须知道手动完成的全过程。这样才能知其所以然。

    而关于 Sinatra ,实在是没有找到相关的书籍,这里说声抱歉。

    笔者学习的栈为:

    1. 编程语言:ruby
    2. 前端框架:React
    3. 后端框架:Sinatra
    4. 数据库:MongoDB

    数据库的基本操作

    目前主要采用的是关系型数据库,所以笔者了解了一些数据库的知识,便于存储应用数据:

    1. 启动 /关闭数据库
    2. 数据库中增删改查数据的命令
    3. 如何连接数据集( collection )

    另外,不同的框架连接数据库的方式可能有所区别,比如 Sinatra 框架,连接 MongoDB 的方式是通过一个名为 Mongoid 的 Gem 包来实现的。具体的框架有其自己的方式,可以网上查一查。

    版本控制

    版本控制也是一项开发者的必修课。主要的用途是用来管理代码的变更,防止「不知道自己改了哪些玩意」这种啼笑皆非的情况出现(特别是团队合作时)。关于版本控制,目前网上的教程特别多,最常用的软件是 Git 、Svn 、Gerrit 等等。笔者是通过廖雪峰大佬的 Git 教程学会的 Git 基本操作,强烈推荐。

    构建与部署

    在自己的电脑上完成了应用程序的编写以后,为了让互联网上的用户可以访问我们的网页,则需要去配置一台服务器,并把应用部署在服务器上。购买云服务器的过程在这里不赘述了。

    笔者学习了两种方式,一个是相对比较手动的 Nginx 部署,另外一个是更 Devops 一些的 K8s 部署方式,关于这两种方式,建议直接找它们的官方文档,写的很全很精细了。

    通常情况下,团队中会有专人负责部署代码,比如专门的运维人员,或者团队中的 leader 。不过了解这一块,是成为独立开发者很关键的一步。我们并不需要成为专家,不过了解这些事情是如何发生的,对于职业生涯来说是非常有好处的。(万一哪天轮到咱们部署了呢~)

    测试自己的代码

    在这里的测试,是指调试代码+测试功能。在团队中的程序员可能会和专门的测试人员合作,但独立开发者很少有这么优厚的条件(甚至很多小团队中也没有专门的测试人员)。而且作为一个对自己有要求的开发者,交付之前尽量保证交付代码的质量,也是一项优秀的特质。关于测试我们最起码要了解的一些兜底的方法:

    1. 冒烟测试:写完后对自己的应用做一些简单的测试,例如启动、登录系统、查看主界面等,以确保系统能够正常运行,没有严重的错误和问题。
    2. TDD 测试驱动开发:开发者在写代码之前,先写测试用例,根据用例写功能,最后用例验收,有很多自动化的工具可以用。这一项在打工时用到的不多,大手子也是和笔者在一起搞开源时才会用到这个实践。
    3. 桌面测试:把代码交付给测试人员或者使用者之前,开发者当着面演示一下系统操作。这个看上去很简单的方法,可以减少非常多的扯皮....(写代码也要脸嘛- -)

    尾声

    以上就是笔者跌跌撞撞入了「全干工程师」的门的学习经历,至今依然是一枚萌新菜鸟,不断求索中。而上述的历程属实是让笔者从一个门外汉,真真切切走向了能够自我正循环学习 Coding 的前进之路。发在这里,仅供参考。也欢迎大家给一些意见和建议。后续笔者也会推动大手子根据教我的历程写一写开源的教程,毕竟我这么笨的人(从没见过这么木的家伙,大手子原话)他都能教得七七八八,何况其他。以上,希望对诸君有用。

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5279 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 07:52 · PVG 15:52 · LAX 23:52 · JFK 02:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.