[萌新上路] 远程工作的技能储备:我是如何学会写代码的 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
niceyuri
V2EX    分享发现

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

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

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

    起源于和一个多年的大手子开始学习 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 )ChatGPTGoogle 英文结果( 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     Solana     3620 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 00:41 PVG 08:41 LAX 17:41 JFK 20:41
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86