[IT技术] 软件开发如何入门?

[复制链接]
lihanyue 发表于 2024-1-7 00:57:01|来自:美国 | 显示全部楼层 |阅读模式
我是一个三本院校计算机专业的大三学生,事实上却对编程毫无概念。三年都玩了。一直想做软件什么的,可是一直无从下手,不知道如何入手。到底如何开发软件。
全部回复6 显示全部楼层
xtigmh 发表于 2024-1-7 00:57:27|来自:美国 | 显示全部楼层
除了学习资源,今天聊点不一样的。
曾经有一个自学的小伙伴,问过我很多基础的问题,比如github是什么,为什么大家都在讨论xx框架....,他用了7个月的时间成为了一名开发。下面聊聊他是怎么做的。
一、自学开发的过程

在学习早期,认识同频一起学习的朋友非常重要。一开始选择语言是非常头疼的事情,不过,不知道使用什么语言也没事。要么你就都敲一遍看看哪个有趣,要么就是看未来的发展方向,自己更像做什么。
一开始学的时候,大概率是非常差的,但其实你差不差只有自己知道和在意。反而因为新手,有差的理由。
关于教程,看新的看成套的看有讲义的,下个阶段我们来分享有讲义+项目的课程。在学习过程中,不仅仅要注意自己的代码细节,还要看看其他人都在做什么。
一些阅读内容:


  • freeCodeCamp 技术专栏 (当然了)
  • Codebar (该平台会访谈自学成才的工程师们)
  • A List Apart (发布一系列主题,从设计到编程到职业发展)
  • Smashing Magazine (专题文章、书籍、新闻、工作......应有尽有)
二、Java小白必看文章

关于Java之父、Java的平台、Java应用以及就业方向,看这篇内容。
怎么入门 Java 编程?如果你想更深入的了解计算机相关的知识,这篇是小白扫盲必看内容。
想学编程却又对计算机一无所知怎么办?三、学习计划

希望大家可以参考黑马程序员这样的计划,根据自己每天学习的时间制定自己的学习计划。给大家作为参考
笔记包含知识点
Java-第一天-基础语法人机交互、Java以及发展史、主要特性、JRE和JDK
Java-第二天-Java基础注释、字面量、变量、数据类型、标识符、键盘录入
Java-第三天-IDEA下载安装IDEA下载安装、中层级结构介绍、第一个代码、类、模块、项目的相关操作
Java-第四天-运算符运算符和表达式、算数运算符、隐式转换、强制转换、字符串相加、算术运算符总结;附习题
Java-第五天-流程控制语句流程控制语句、if语句、switch语句、循环结构
Java-第六天-回顾+练习相关练习题巩固前五天内容;
Java-第七天-面向对象类的概念,设计类获得对象,定义类的补充注意事项。内存图,构造器,this关键字,封装,标准JavaBean。成员变量和局部变量区别。
Java-第八天-常用APIString的概述,创建对象,常用API-字符串内容比较、遍历、替换、截取、分割操作;ArrayList相关学习;
Java-第九天-ATM系统以上内容完成后可以联系。
Java-第十天-面向对象进阶static、单例、代码块、继承
Java-第十一天-面向对象进阶包、权限修饰符、final、常量、枚举、抽象类、接口等。
Java-第十二天-面向对象进阶多态、内部类、常用API
Java-第十三天-常用API时间与日期、JDK8新增日期类、包装类、正则表达式、Arrays类、常见算法、Lambda表达式
Java-第十四天-集合集合的体系特点
Collection的常用方法
集合的遍历方式
集合存储自定义类型的对象
常见数据结构
List系列集合
补充知识:集合的并发修改异常问题
补充知识:泛型深入
Java-第十五天-集合Set系列集合、、Collection体系的特点、使用场景总结、Collection体系的综合案例、Map集合体系、补充知识:集合的嵌套
Java-第十六天-Stream、异常体系创建不可变集合、Stream流、异常处理
Java-第十七天-日志框架、阶段项目日志框架、日志技术体系结构、Logback概述
Logback快速入门、Logback配置详解-输出位置、格式设置、Logback配置详解-日志级别设置、阶段项目实战
Java-第十八天-File类、IO流File类的使用、IO流:概述、IO流:字节流、IO流:资源释放的方式

字符流、字符输出流、缓冲流、转换流、序列化对象、打印流
Java-第十九天-多线程多线程的创建
方式一:继承Thread类
方式二:实现Runnable接口
方式三:JDK 5.0新增:实现Callable接口
Thread的常用方法、线程安全、线程同步、线程通信、线程池
补充知识:定时器
补充知识:并发、并行
补充知识:线程的生命周期
Java-第二十天-网路编程网络通信三要素、UDP通信-快速入门
UDP通信-广播、组播、TCP通信-快速入门、TCP通信-多发多收消息、TCP通信-同时接受多个客户端消息、TCP通信-使用线程池优化、TCP通信实战案例-即时通信、TCP通信实战案例-模拟BS系统
Java-第二十一天-单元测试、反射、注解、动态代理单元测试、单元测试概述、单元测试快速入门、单元测试常用注解、反射、注解、动态代理
Java-第二十二天-XML、XML解析、设计模式等XML、XML检索技术:Xpath、设计模式:工厂模式、设计模式:装饰模式x
上述课程表是以每天学习6最少小时为基础设定的学习内容,如果各位小伙伴每天只有4小时学习内容,需要重新设定学习内容。
基础模块的计划定好,还要清楚的知道每一天学什么



四、Java学习资源

简略版Java学习路线图:

(下方链接点开直接进入课程当中)


  • 入门:Java SE基础 → Java Web(含数据库+H5+js+vue)
  • 中级:Maven → Git → SSM框架 → MybatisPlus → Spring Boot→ 《传智健康》项目实战 → 《瑞吉外卖》项目实战
  • 进阶:Spring Cloud(微服务开发,学这一套就够了) 也可以按照以下技术点学:
    Dubbo → Zookeeper → RabbitMQ → RocketMQ → Docker → Redis → MongoDB → 搜索技术Elasticsearch → MySQL进阶
  • 项目:《SaaSiHRM》企业服务 → 《好客租房》生活服务 → 权限管理一体化解决方案 → 短信网关平台
  • 面试:Java大厂面试专题课 → Java百度地图
以上技术,足以支撑大家找到一份好的Java开发工作,如果想工作后再提升,页面底部还有30+套课程。
工作后可以再学习提升的技术:
JDK8-15新特性 → 编程强化 → 数据库强化 → 安全框架SpringSecurity → 报表技术 → 模板引擎VelocityTools → 工作流Activiti7……
黑马程序员:2023年黑马程序员Java学习路线图五、学习笔记

【基础】


  • 黑马程序员:自学Java第一天-认识Java以及JDK的安装和下载
  • 黑马程序员:自学Java第二天-Java基础语法以及IDEA安装操作
  • 黑马程序员:自学Java第三天-运算符、表达式、字符串的操作等
  • 黑马程序员:自学Java第四天-流程控制语句
  • 黑马程序员:自学Java第五天-数组全部知识点以及7个练习题
  • 黑马程序员:自学Java第六天-循环、条件控制语句、Random(附习题)
  • 黑马程序员:自学Java第七天-方法的概述
  • 黑马程序员:自学Java第八天:面向对象
【JavaWeb】


  • MySQL的安装及登陆基本操作(附图)手把手带你安装
  • MySQL基础:通过SQL对数据库进行CRUD
  • MySQL基础:通过SQL对表、数据进行CRUD,万字实际案例手把手教程
  • MySQL高级:掌握约束的使用
  • MySQL高级:掌握表关系及建表原则
  • MySQL高级:重点掌握多表查询操作
  • MySQL高级:以实际案例掌握事务操作
  • JDBC:从CRUD开始,理解JDBC中的各个对象作用,掌握Druid的使用
  • Maven从安装到手把手教学进行项目管理
  • MyBatis完成代理方式查询数据以及核心文件配置、
  • Mybatis:使用映射配置文件实现CRUD操作,能够使用注解实现CRUD操作
  • HTML标签大全,存起来总有一天用的上
  • Java后端学CSS内容
【SSM】


  • SSM框架01:Spring的IoC和DI,以及手把手带你创建Spring核心配置文件
  • SSM框架02:从0-1学习Spring配置文件
  • 为什么要学Spring?学什么?怎么学?
  • Spring到底是如何来实现IOC和DI?案例解析入门篇
  • 万字详解Spring之IOC全部知识点
  • 详解DI相关内容,一文掌握DI配置与使用
  • Spring掌握IOC/DI配置管理第三方bean
  • Spring核心容器环境配置、创建、依赖注入等
  • Spring掌握IOC/DI注解管理第三方bean
  • Spring:IOC/DI注解开发管理第三方bean
  • 完成Spring与Mybatis及Junit的整合开发
  • Spring:入门AOP案例分析
  • 能运用AOP相关知识完成对应的案例编写
y007 发表于 2024-1-7 00:57:47|来自:美国 | 显示全部楼层
如果想要学习软件开发并入门,可以通过以下几个步骤:

  • 选择一门编程语言学习:选择一门流行的编程语言学习,例如Python、Java、C++、JavaScript等,建议初学者从易到难、从简单到复杂地学习。
  • 学习基础的编程概念和知识:了解基础的编程概念和知识,例如变量、循环、函数、数据结构等,可以通过在线教程、编程书籍等方式进行学习。
  • 学习开发工具和环境:学习如何使用常用的开发工具和环境,例如代码编辑器、集成开发环境、版本控制工具等。
  • 练习编写小型项目:练习编写小型项目,例如命令行工具、简单的网页应用程序等,可以帮助您理解并掌握基础的软件开发技能和方法。
  • 学习开源项目并贡献代码:学习如何阅读和理解开源项目的源代码,学习如何参与开源社区并贡献代码,可以帮助您进一步提高软件开发能力和水平。
  • 持续学习和提高:软件开发是一个不断更新迭代的领域,您需要持续学习和提高自己的技能和能力,学习新的编程语言、框架、工具和技术,以适应快速变化的市场需求。
总之,软件开发是一个需要不断学习和提高的领域,需要对编程和计算机科学有浓厚的兴趣和热情,需要不断练习和实践,同时需要持续学习和关注行业发展趋势,以不断提高自己的技能和能力。
--推荐阅读--

1、测试前景类
软件测试有前景吗? - 知乎 (zhihu.com)
软件测试行业到底有没有前景和出路? - 知乎 (zhihu.com)
软件测试工程师的工资有多高? - 知乎 (zhihu.com)
软件测试的岗位会越来越少吗? - 知乎 (zhihu.com)
开发岗和测试岗的待遇怎么样? - 知乎 (zhihu.com)
国内的软件测试那么不受待见吗? - 知乎 (zhihu.com)
软件测试工程师的工资有多高? - 知乎 (zhihu.com)
软件测试真的看不到前途吗? - 知乎 (zhihu.com)
今年已经28了,自学软件测试还有前途吗? - 知乎 (zhihu.com)
软件测试市场真的饱和了吗? - 知乎 (zhihu.com)
2、测试择业类
软件测试工程师的一天工作内容是什么? - 知乎 (zhihu.com)
测试好多都是性能小白,虽学了些性能知识,但在实际工作做开展性能测试,都很茫然,求指导,应该怎么处理? - 知乎 (zhihu.com)
软件测试人员怎么快速让自己牛逼起来?大概要多久才能很牛逼? - 知乎 (zhihu.com)
做了大半年的软件测试,可是觉得我在浪费时间,怎么办? - 知乎 (zhihu.com)
四年测试工程师经历,下一步转开发还是继续测试? - 知乎 (zhihu.com)
国内的软件测试那么不受待见吗? - 知乎 (zhihu.com)
女生学软件测试,容易吗,这个工作会不会压力很大? - 知乎 (zhihu.com)
软件测试是不是很简单,什么人都可以学? - 知乎 (zhihu.com)
女生学习软件测试,是报培训班还是自学好呢? - 知乎 (zhihu.com)
今年30了,做了5年的软件测试,只会功能测试的怎么办? - 知乎 (zhihu.com)
20岁零基础转行软件测试领域,求知友分享自学干货和面试经验? - 知乎 (zhihu.com)
对于0基础即将转it行业(软件测试)的人,有什么忠告? - 知乎 (zhihu.com)
求教各位大神,软件测试难不难 我不是计算机专业的,也能学吗? - 知乎 (zhihu.com)
3、测试入门类
如何编写测试用例? - 知乎 (zhihu.com)
为什么要写测试用例,测试用例写给谁看? - 知乎 (zhihu.com)
关于新手如何编写测试用例? - 知乎 (zhihu.com)
26岁毕业一年代课老师干不下去了,想去培训转软件测试怎么选择? - 知乎 (zhihu.com)
作为软件测试的前辈你能不能给我点建议? - 知乎 (zhihu.com)
零基础想转行做软件测试,可以吗? - 知乎 (zhihu.com)
软件测试入门有哪些书籍可供推荐? - 知乎 (zhihu.com)
作为一名软件测试工程师,需要具备哪些能力? - 知乎 (zhihu.com)
测试工程师面试题,你都遇到过哪些呢? - 知乎 (zhihu.com)
新人如何入门和学习软件测试? - 知乎 (zhihu.com)
自学软件测试怎么学? - 知乎 (zhihu.com)
测试开发岗以后转开发容易吗? - 知乎 (zhihu.com)
想做测试开发,需要从什么开始学习? - 知乎 (zhihu.com)
4、咨询培训类
刚从软件测试培训班出来,公司就我一个测试,怎么办? - 知乎 (zhihu.com)
纠结中,转行软件测试是该自学还是培训? - 知乎 (zhihu.com)
培训班软件测试工程师45天学会,帮找到工作,靠谱吗? - 知乎 (zhihu.com)
从培训机构出来的软件测试工程师,公司会介意吗? - 知乎 (zhihu.com)
哪个Python自动化测试培训机构比较好?线上培训靠谱吗? - 知乎 (zhihu.com)
软件测试到底要不要报培训班? - 知乎 (zhihu.com)
想转行学软件测试,深圳这边有没有比较靠谱的培训班推荐呀? - 知乎 (zhihu.com)
5、测试求职类
好的软件测试人员简历是什么样子的? - 知乎 (zhihu.com)
软件测试简历项目经验怎么写,没有项目经验? - 知乎 (zhihu.com)
明天去面试软件测试,给我些建议,或者面试题预测? - 知乎 (zhihu.com)
没有软件测试经验的计算机毕业生如何准备面试测试工程师这一职位? - 知乎 (zhihu.com)
没有软件测试实习经验春招能找到软件测试工作吗? - 知乎 (zhihu.com)
软件测试,投了三百份简历,一个面试也没有,会是什么原因呢? - 知乎 (zhihu.com)
实在没货,简历(软件测试)咋写?有HR帮喵喵么? - 知乎 (zhihu.com)
请教软件测试工程师的简历要怎么写?我不是计算机专业的。? - 知乎 (zhihu.com)
软件测试的简历里面,项目介绍要怎么写好呢~? - 知乎 (zhihu.com)
软件测试培训完找不到工作怎么办? - 知乎 (zhihu.com)
大家面试测试工程师一般问什么问题? - 知乎 (zhihu.com)
如何去面试软件测试工程师? - 知乎 (zhihu.com)
学姐推荐了一个面试机会,是软件测试的实习生,目前小白一枚还有八九天就要面试,有技术面怎么样才可以速成? - 知乎 (zhihu.com)
软件测试工程师没有设计过测试用例,如何在应聘中弥补这一不足? - 知乎 (zhihu.com)
面试软件测试的时候,应届生怎么包装自己的简历? - 知乎 (zhihu.com)
测试工程师求职简历应该写些什么东西?项目经验如何写? - 知乎 (zhihu.com)
6、技术分享类
经典面试题:浏览器输入 URL 背后发生了什么?(图解版) - 知乎 (zhihu.com)
如何借助开源工具进行 Android 的稳定性测试? - 知乎 (zhihu.com)
从 0 开始学 Python 自动化测试(一) - 知乎 (zhihu.com)
从 0 开始学 Python 自动化测试(二)-环境搭建 - 知乎 (zhihu.com)
接口测试框架实战(一) | Requests 与接口请求构造 - 知乎 (zhihu.com)
接口测试框架实战(二)| 接口请求断言 - 知乎 (zhihu.com)
接口测试框架实战(三)| JSON 请求与响应断言 - 知乎 (zhihu.com)
接口测试框架实战(四)| 搞定 Schema 断言 - 知乎 (zhihu.com)
服务器监控从 0 到 1 实战:使用 Zabbix + Grafana 搭建服务器监控系统 - 知乎 (zhihu.com)
测试用例是怎么写的? - 知乎 (zhihu.com)
感觉测试用例好难写怎么办? - 知乎 (zhihu.com)
常见的软件测试用例设计方法有哪些呢? - 知乎 (zhihu.com)
软件测试求职,笔试中怎么写测试用例? - 知乎 (zhihu.com)
做软件的功能测试是在浪费时间吗? - 知乎 (zhihu.com)
如何写出高效的软件测试用例? - 知乎 (zhihu.com)
学习软件测试掌握什么基本知识? - 知乎 (zhihu.com)
自学软件测试自动化,到时简历该如何写呢? - 知乎 (zhihu.com)
想做自动化测试,学pytest,要从哪里入手呢? - 知乎 (zhihu.com)
pytest的参数化要怎么做啊? - 知乎 (zhihu.com)
pytest的数据驱动要怎么实现呢? - 知乎 (zhihu.com)
7、职场提升类
作为软件测试人,所在公司部门只有功能手动测试,如何进一步提升自己? - 知乎 (zhihu.com)
已从事软件测试一年,感觉依然很菜,只会基础的功能测试,想进一步学习,有没有好的建议呢? - 知乎 (zhihu.com)
一个菜鸟怎样做好功能测试? - 知乎 (zhihu.com)
成为一个优秀的测试工程师需要具备哪些知识和经验? - 知乎 (zhihu.com)
软件测试除了做好功能测试自动化测试之外,如何在职位上获得提升? - 知乎 (zhihu.com)
面试软件测试工作,如何回答:为什么要从事软件测试行业?你觉得你会什么? - 知乎 (zhihu.com)
学习软件测试有什么好的学习方法、建议? - 知乎 (zhihu.com)
刚入行的测试工程师如何自学软件测试? - 知乎 (zhihu.com)
8、学习视频
《Pytest测试框架与Allure2》
【软件测试/测试开发】Pytest测试框架与Allure2《APP功能测试实战》
【软件测试/测试开发】APP功能测试实战《大厂面试题解析》
【软件测试/测试开发】大厂面试题解析《接口测试初级入门教程》
【软件测试/测试开发】接口测试初级入门教程《APP自动化测试入门》
【软件测试/测试开发】APP自动化测试入门《七小时入门软件测试》
【软件测试/测试开发】七小时入门软件测试《Web自动化测试快速入门》
【软件测试/测试开发】Web自动化测试快速入门《Postman接口测试实战入门》
【软件测试/测试开发】Postman接口测试实战入门《rest-assured框架进行接口测试实战》
【软件测试】java语言rest-assured框架进行接口测试实战_哔哩哔哩_bilibili《软件测试如何获取高薪——面试专区》
【软件测试/测试开发】软件测试如何获取高薪——面试专区《软件测试开发BAT一线名企面试指南》
【测吧】软件测试开发BAT一线名企面试指南-小白慎点-(霍格沃兹测试学院)_哔哩哔哩_bilibili《软件测试工程效能》
【软件测试/测试开发】软件测试工程效能《零基础新手入门软件测试必知必会》
【软件测试/测试开发】零基础新手入门软件测试必知必会《互联网大厂面试攻略》
【软件测试/测试开发】互联网大厂面试攻略《软件测试管理必修课》
【软件测试/测试开发】软件测试管理必修课
kevinnest 发表于 2024-1-7 00:58:02|来自:美国 | 显示全部楼层
1、开始自学软件编程课程
编程语言种类繁多,各有千秋,在学习之前需要明确自己要学习哪一门编程语言。确定之后需要制订一个合理的学习计划,并且持之以恒地执行学习计划。在学习过程中要养成良好的学习习惯。
不爱研究、坐不住,但凡三天打鱼两天晒网,或者对计算机不喜欢等一类人不适合学习编程,哪怕一时努力,最后也不是结不了业,就是功败垂成,难以在这条路上走远。编程入门点是兴趣。兴趣是学习的最大动力源。需要有恒心有耐心,进入这个行业并不难,就算你没有基础和经验,也是可以学好的。那些创造编程语言的人,创造计算机的人也都是从零开始的。他们也是在不断揣摩、不断学习和实践之火才获得成果。没有一个技术大牛是从一开始就什么都会的,都是从什么也不会开始的。只需你有兴趣而且肯努力,可能慢慢就会发现学习软件开发也没有想象中的那么难。
2、要重视编程基本功
绝大部分行业内的大牛都是经历过辛苦而又长期的程序开发学习和实战进程的,假如你想要成为一名优秀的程序员,最基本的编码学习肯定是不能跳过的,底层的知识必需要扎实掌握,就如同Java开发,项目训练前提是掌握一定的java课程基础,假如不先把基础稳固,就直接做项目的话,是很难做出来而且学不会那种逻辑思考的能力。
3、附加技能的学习
前面说了软件开发涉及到一种逻辑思维,那么必定要学习一些数学知识,学会数学公式的运算。软件开发行业是特别注重效率的,假如你编写的某个功能的逻辑不是很清楚,可能整个项目都会绕一个很大的圈子,这样的代码存在许多冗余成分,浪费很多时间,所以要懂得培养自己必定的逻辑思维。其次就是英语的学习了,虽然学软件开发不需要有很强的英语能力,但有必定的英语才能的话,更加有利于自己往更深邃的技术发展。
4、动手能力的培养
作为一个程序员动手能力是非常重要的,你学习的各个知识点和思维都自己去开发操练才能稳固,作为老师最怕的学生就是他们只停留在书本或许课堂上的了解,而自己不去实实在在的把它完成出来,着手做的过程中你会不断发现问题,然后自己去解决问题,这样你才能成为一个真正的高手。也要学会找到有效的学习办法,这样学起来会如鱼得水的。可以先看视频学习,学起来就比曾经看书快许多,并且也更简略,觉得自己掌握了一定的知识后,可以尝试做项目,从小项目开始练手到商业项目实战,懂得实操的软件开发工程师才是企业真正喜欢的。

awdrgyjil 发表于 2024-1-7 00:58:40|来自:美国 | 显示全部楼层
  当我刚开始学习软件开发的时候,我根本毫无头绪。
  我感觉很沮丧。所有的东西我都看不懂,我甚至不认为我可以“掌握”编程。
  我之所以告诉你这点是因为我觉得既然你选择了我这本书,说明你可能跟我那时的感觉是一样的。
  不要担心,这很正常。事实上,这根本就是常态。
  让我来彻底澄清一件事:你不需要是一个天才,甚至智力水平不需要超过平均水平,也能成为一个软件开发者。
  对于一个刚刚进入软件开发大门的初学者,如果你没有觉得茫然,并感觉自己像是被在脚踝上绑着重物丢进池底的话,你可能是哪里做错了,也可能你压根就不是一个普通人——或者二者皆是。
  无论如何,你应该清楚刚入门的时候是会感觉困难和混乱的,但是这种状态不会持续太久的——我向你保证。
  我是如何起步的
  依稀记得当我开始自学编程的时候。那时候并没有像现在这么多的编程资料。事实上,我根本没有任何的资料。
  我去下载了一个很流行的 MUD 源码(Multi-User Dungeon  多人地下城,你可以将它想像成一个基于文本的魔兽世界,毕竟那是一个使用调制解调器进行拨号上网的时代)。
  但是我根本搞不懂我看的代码是什么意思。我所知道的只是我想创建一个属于自己的修改版 MUD  并为其添加新的特性,而要达到这个目标的关键就隐藏在这一堆看不懂的神秘文本中。
  于是我开始瞎搞,我修改了某些变量的值。我试图去寻找控制暴击机率的代码,并对其进行修改,重新编译,然后看看会发生什么。
  有时候它照我的预想运行了,而有时候它根本编译不起来。在探索代码可以运行和不能运行的过程中,我已经学习到东西了。
  我依然不懂我所修改的东西,但是经过了一个星期左右的“瞎搞”,我居然真的创建出了一个有我自己添加过功能特性的新版本 MUD。
  成为一个娴熟的程序员还有很长的路要走,但我已经开始了 —— 所有人都需要一个开始。
  我讲这个故事是想让你明白,相比直接拿起一本书,相比去大学或者培训机构,相比其它任何事情...这才是入门编程的正确方式。
  你必须自己熟悉代码,了解哪些方式可以让它工作,而其它方式不行。(我确信这才是学习的最佳方式。请参考我的软技能一书中关于学习的章节。)
  但是,学习如何编码跟如何进入到软件开发的世界之间还是有很大区别的。
  没错,你必须先学会编码,但是软件开发并不仅仅是写代码,本章讲的就是关于代码之外的那些技能。
  了解这个职业
  首先,你需要了解一些软件开发的知识。
  它比你想像中要来得容易,也要来得难。
  本书有一整个小节专门讲述“软件开发所要掌握的技能”,但是我想先要这里做一个快速的综述。
  软件开发并非只是写代码。编程是其中很大的一部分,但是如果只会编程的话,你可能走不了太远 —— 特别是当你想从工作中脱颖而出的话。
  软件开发背后的思想是将手动的过程自动化,或者是创造一个新的自动化过程来完成一些无法使用手动完成的工作。
  想像一下我现在正在使用的文字处理软件。我正在使用 Google Docs 写这篇文章。
  如果没有 Google Docs 或者其它的文字处理软件,我就必须使用打字机或者手写的方式来写文章。
  如果我想要对文章进行格式化,我就必须在打印前手动进行排版。
  如果我想修改一些错误 —— 特别是拼写错误 —— 的时候,我需要在手边放上一瓶涂改液。(可能还需要一瓶威士忌。)
  当然,现在不仅仅有 Google Docs  可以帮助我完成这些事情。还有很多其它的硬件或者软件可以帮我将手写或者排版的过程自动化,但是我想你已经明白我的意思了。
  因此,在你上车之前,我需要特别强调一件事,这件事你越早知道越好。
  在将一件事自动化之前,你必须知道如何手动完成它。
  了解需求
  太多有抱负 —— 同时也是有经验 —— 的开发者在没有完全理解软件功能需求的情况下进行开发。他们一心只想着写代码。(这对于学习编码来说没有问题 ——  就像上面 MUD 的例子 —— 但对于开发一个企业级软件却是行不通的。)
  当然,你比他们更机智,因为现在在看这本书。
  弄清楚待解决的问题是所有软件开发过程的第一步。你想实现自动化过程的是什么?
  针对这个问题,不同的软件开发模式有不同的办法,不过对我们来说,目前那并不重要。现在最重要的是,你需要通过某些方法,去收集需求并在开发真正编码之前理解你需要解决的问题是什么。
  这件事可以很随意,跟潜在的客户讨论下他想要的软件,以及这个软件有哪些功能。也可以很正式,编写一份标准的文档说明。
  设计
  一旦你明白需求是什么,你就可以开始设计如何使用代码完成这个需求了 —— 再次地,你需要在动手写代码之前完成设计。
  可以把它视为你的代码架构蓝图。同样的,不同的软件开发模式有不同的方法来解决这个问题,但现阶段最重要的还是你需要在开发编码之前进行某种程度上的设计。
  这对于不同规模的软件都适用。有些学习过敏捷开发(会在之后的章节中讨论到)的程序员觉得他们不需要任何设计,只需要开始编码就行了。虽然事前设计不是敏捷开发的重要,但是设计仍是必要的。
  你不可能随随便便就写出一个软件来。
  编码
  只要设计完成后,你就可以开始针对这个软件的功能编写一些测试了(也就是测试驱动开发或 TDD),也可以直接开始写代码了。(我们会在后面的章节讲到  TDD。)
  编码是一个专门的主题,所以在这里我并不会详细展开,不过我想推荐两本必读的关于如何写出好代码的书。
  首先,我推荐 Steve McConnell 的《代码大全》,这是一本所有程序员都必读的经典书籍。
  第二本是 Rober Martin 的《代码整洁之道》,教你如何写出更好代码的另一本经典书籍。
  用现在的话讲就是,这两本书可以教你如何写出优雅的代码,即有良好的可读性,同时易于维护。
  这两本书对我的编码技术有非常深远的影响,特别是在于代码的清晰性和设计上。
  测试及发布
  一旦编码完成了,我们就该发布了,不是吗?
  错!现在进入到了对代码进行测试的流程。还是那句话,不同的开发模式有不同的办法来处理这个问题,但是通常来说,在软件正式发布给用户之前都需要进行某种程度上的测试。
  比如对于传统的瀑布流开发模式,测试阶段处于整个软件开发过程的末期。但是,在敏捷项目中,在每一个迭代过程中都需要进行测试,每个迭代通常为 2  个星期左右。
  一旦代码测试完成了,就开始进行发布了,关于发布也有它自己完整独立的流程。
  我们现在还不会深入到细节中 —— 后面会有一整章专门讨论这个问题 ——,但是发布流程其实就是将开发完成的软件部署到服务器上,在 app store  上架,或者使用其它可以让用户获取到软件的方式。(这个过程可以相当复杂。)
  在这个过程中,代码可能 —— 好吧,其实是必须 ——  被存放到源码仓库中,这个源码仓库会管理不同版本的代码,并且它在开发过程中的变化都会被存储下来。
  在某些比较复杂的应用中,会涉及到数据的存储,这里我们还需要用到数据库。
  数据库通常会用来存储应用的用户数据,或者一些配置信息,而这些数据也都需要跟随代码一起更新。
  很多软件开发团队会使用某种形式的持续集成环境,它可以在代码被提交的时候自动进行构建。
  编程不仅仅是写代码
  最后,别忘了调试。作为一个开发者,你的大部分时间将会花在搞清楚为何你的 —— 或者别人的 —— 代码不能正常工作。
  如你所见,软件开发可不仅仅是写代码这么简单。
  在你找到一份真正的程序员工作之前,你需要对所有的这些技术有所了解。更进一步地,但愿你对这其中的某些技术能达到熟练的程度。
  不要害怕,帮你达到上面的目标就是我写作这本书的目的 ——  或者至少给你指明一个正确的方向。你可能需要自己去学习所有的技术,但是至少我会告诉你如何去学习它们。
  制定一个计划
  好吧,John,现在我已经明白了软件开发不仅仅是写代码,并且我愿意花很多时间去进行调试,但是你还没告诉我如何入门呢?怎么说?
  唔,是的。我明白你的意思,但是你知道吗?我有一个好消息告诉你:你已经入门了。恭喜。
  在你拿起一本书,就像这本一样,并且开始理解软件开发不仅仅是写代码时,你已经比其他大多数的开发者有一个更好的开始了。
  没错,没错,这种说法是有点自我感觉良好,但是它确实是真的。有一天当你成为一个像我一样老成的软件开发时,你也会说同样的话。
  现在,让我们讲点更实用的,你需要制定一个计划。
  是的,就是一个计划。一个真正的,不瞎逼逼的计划,它能让你从对软件开发一无所知(或者接近一无所知)成长为一个经验丰富的开发者。
  你有很多不同的路可以走 —— 我会在后面的章节中一一介绍 —— 但是选哪条路不是最重要的,更加重要的是你要选一条路,并坚持走下去。
  整合计划
  让我们看看你的计划应该是什么样的。
  首先,你需要对自己当前的水平有一个正确的评估,同时搞清楚需要学习哪些知识。
  你有任何软件开发的经验吗?
  你了解任何一门软件开发语言吗?
  你之前写过任何应用吗,或者你完完全全就是从零开始?
  我前面提到的其它技能呢?
  你有没有掌握它们中的任何一项?
  你对数据库,源码版本控制,测试驱动开发,测试,调试或者软件开发模式有任何的了解吗?
  同时,问问你自己想做哪个方向的软件开发。
  很多新手可能都想做游戏开发,但是这现实吗?如果是的话,你要从哪里开始?你有没有做好觉悟,投入大量的时间去应对挑战,去走这条很长并且很孤独的道路?
  太多的人在没有经过任何的事前思考的情况下就朝着某个方向出发了。
  花些时间去回答这些问题,这样你就会在开始前有一个合理清晰的计划。
  不要误解我的意思,我当然会在本书中尽量帮助你解决这些问题,但是我不能代替你做全部的事情。
  我能够给你提供成为一个好的,甚至是优秀开发者的所有信息,但是你需要自己将这些信息进行整合并制定一个适合自己的计划,然后照着这个计划走。
  创建计划
  一旦你对这些问题有了自己的思考,就到真正创建一个计划的时候了。
  创建计划的最好方式就是从你想达到的目标进行倒推。
  相比于“学习如何编程”或者“成为一个软件开发者”,你要对自己想成为哪个方向的开发有更明确的目标。
  在本书的“你所需要掌握的软件开发知识”小节中,我会介绍不同的软件开发角色与工作类型以供你选择,你也可以自行上网搜索,来决定确定哪个最适合你。
  你的目标要越具体越好,这样一来,你就可以知道自己需要学习哪些知识,如何制作简历以及作品集,想进入什么学校或者培训机构,甚至是应聘什么样的工作。
  我知道做出选择和下定决心有多困难,但是关于目标的重要性我再怎么强调也不为过。
  这个目标越具体,后续的学习就越容易。你会清楚地知道每一步需要学习什么知识,以及如何行动。
chouwa 发表于 2024-1-7 00:59:11|来自:美国 | 显示全部楼层
感谢邀请
首先一点,那就是你需要学习很多东西才能成为软件开发人员。
不能详尽说明作为软件开发者你可能需要掌握的所有技术技能,但是我会列出最关键的一些技术技能。
选择编程语言,这是最重要的。前端开发,是现如今最热门的开发岗位,高级的前端开发工程师,在企业里面是非常欠缺的。成为前端开发工程师,第一步应该是学习HTML/CSS/JavaScript,这是基础,也是根本,JavaScript是根本里面的根本,叫根深蒂固。
许多新手程序员会试图一次性或在第一份工作之前学习几种编程语言,以便于有备无患。
虽然我认为你最终应该学会一种以上编程语言,但我不建议提前这样做,因为这只会导致混乱,并且会分散你需要学习的其他技能的精力。
相反,我建议你应该深入研究,重点学习单一编程语言的来龙去脉,这样你才能对用这种编码语言来写代码信心十足。
构造代码
在学习了一门编程语言之后——或者最好是在学习的同时——我坚信,你需要知道的下一件事就是如何正确地构造你的代码。
我所说的构造代码是什么意思呢?
我的意思是,要写出好的,清晰的,易于理解的代码,不需要大量注释,因为代码本身就是一种表达方式。
很多软件开发者在他们整个职业生涯都不曾去学习这个技能,这是不幸的,因为这是我——以及其他许多人——判断一个软件开发人员技术和能力的主要方式。
良好的代码结构展示了对这种技艺的热衷,而不仅仅是为了完成工作。
构建代码是软件开发真正的艺术部分,但它也是至关重要的,因为你和你的同事得花费相当多的时间来维护现有的代码,而不是编写新的代码。
具体应该如何正确地组织代码我就不说了,因为我已经给出了一个很好的资源,但是要努力学习如何从一开始就写出好的、干净的代码,而不是事后学习这个技能。
我只能保证,即使你是个新手,如果你可以写出好的、干净又简洁的、易懂的,本身就可以表达意思的代码,那么任何面试官看到你的代码都会觉得你是一个有经验的专业人士。
并且在一定程度上,或者至少在这条道路上,因为你会将这个职业当作一种专业,而不是一份工作。
面向对象的设计
这有争议的,特别是如果你正在学习的编程语言并不面向对象,但是有大量的软件开发世界会按照面向对象设计的思维思考,所以你需要确保你了解它。
面向对象的设计是一种将复杂程序设计分解为单独的类或对象(类的实例)的方法,其中封装功能且具有特定的角色和责任。
在软件开发中,我们总是试图管理复杂性。
从对象的角度思考可以帮助我们做到这一点,因为它能让我们从一堆交互组件中定义并设计一个复杂的系统,而不是作为一个整体的试图解决整个复杂性。
现在的编程世界有着大量的函数式编程语言,但你在软件开发中找到的最流行的语言和模式,仍然深受面向对象设计和分析的影响。
你应该好好理解什么是类,继承的不同类型——何时使用它们——还有理解像多态性和封装等术语。
算法和数据结构
如果你上传统院校学习并想获得计算机科学学位的话,那么这是一个很大的考点。
算法是解决各种计算机科学/编程问题的常用方法。
例如,有若干常见的在程序上用于排序的算法。每一种排序算法都有一系列关于速度,内存大小要求,以及数据理想类型的不同属性。
计算机科学领域有很多这样的算法,并且理解如何变化这些算法来解决你可能遇到的棘手问题也很重要,当你解决现实编程问题的时候。
通常情况下,擅长这些算法可以让一个开发人员在1个小时之内就能解决可能需要另一个开发人员几天时间才能搞清楚的问题。
除非你熟悉和擅长算法,否则你甚至不知道已经有了优雅的解决方案在那里。因此,仅仅只为这个原因,我认为这也是一个值得掌握的宝贵技能。
数据结构也是如此,并且可以与算法结合使用。
有几个所有软件开发者都应该熟悉数据结构中的,包括:
数组或向量
链表
堆栈
队列

哈希
集合
通过熟练掌握数据结构和算法,你可以轻松又优雅地解决许多艰难的编程问题。
当我开始编程的时候,我在数据结构和算法方面非常糟糕,因为我主要是靠自学的。
我一直都没有意识到它们的价值,很快,随着我遇到了一些我不知道如何解决的问题,我发现这些技能在真正的编程世界非常有用,而且解决起来相当简单——和有趣。
事实上,我认为这是软件开发最有趣的领域之一。解决难题并利用数据结构和算法来开发一个又干净又优雅的解决方案,真的很有意义。
学习这些东西是一个挑战,但非常值得。这是可以让你超越众多同行的技能之一。大多数软件开发人员都不擅长这个领域。
如果你想通过如微软或谷歌这样的大公司的面试,那么你一定得掌握这个技能集。
开发平台及相关技术
你应该具备一些经验,并至少掌握一个开发平台以及与之相关的技术或框架。
我所说的平台是什么意思呢?
好的,通常它的意思是操作系统(OS),但也适用于其他可以充当类似于操作系统角色的抽象。
例如,你可以是专注于Mac或Windows操作系统得Mac开发者或Windows开发者,你也可以是一名专注于特定的web平台的web开发人员。
具体确切的关于平台是什么就不讨论了——不同的人会有不同的看法——但这里我要定义平台为你开发的特定环境,它有自己的生态系统和特殊性。
再者,这是另一个我认为选择并非那么重要的技术技能,只要你选择了一个就好。
企业通常会聘请开发人员针对特定的平台或技术开发软件。
你作为iOS开发者将更容易找到工作,如果你专业于那个特定平台的话。
这意味着要熟悉平台本身,以及开发工具,惯用模式,还有大多数程序员在为那个平台开发时会使用的通用框架。
你可能会认为编程语言的选择决定了平台,但实际上事实情况很少是这样的。
就拿C#举例。如果你是一个C#开发人员,那么你可以用这种编程语言为Windows,Mac,iOS,Android,Linux,甚至是嵌入式系统写代码。
所以,不要仅仅只是选择语言;还要选择平台。
框架或堆栈
除了学习特定的编程语言和平台,我高度建议去学习框架,或者更好的是,与之相配套的完整的开发堆栈。
什么是框架?
什么是堆栈?
框架就是一系列被用于在特定平台或多个平台上开发代码的库。它通常可以使得在该平台上的编程任务变得更加容易。
看这个C#的例子。大多数C#开发人员使用.NET框架来编写C#应用程序。 .NET框架包括许多库和类,能够让C#开发人员在更高的抽象级别上工作,因为每当他想做什么事情的时候,没有必要完全重新发明轮子。
例如,.NET框架的部分还包含了处理图像的代码。这类代码从头编写是极其困难的,所以框架极大地帮助了C#开发人员去编写需要以某种方式处理图像的代码。
堆栈则有点不同。堆栈是一组技术,通常包括一个框架,并且常一起用于创造一个完整的应用程序。
例如,有一个常见的称为MEAN的栈。它代表MongoDB,Express.js,AngularJS,和Node.js。
MongoDB是一个数据库技术。
Express.js是一个用于创建web应用程序的Node.js框架。
AngularJS是一个用于为web应用程序创建用户界面的前端JavaScript框架。
最后,Node.js是一个用JavaScript开发基于web应用程序的运行时环境。
有没有理解所有这些东西并不重要—— 除非你打算成为一个MEAN开发者——重要的是要明白,如果你知道所有这些技术和框架,那么你就能够开发一个完整的web应用程序。
栈使得创建应用程序变得更容易,因为它们提供了一种许多开发者用来开发应用程序的通用范式,因此知识可以很容易地共享,并且你也能确定哪些特定的技能集市可以一起工作的。
学习堆栈真的是非常有价值,因为这意味着你拥有开发一个完整的应用程序所有必要的技能。很多使用特定堆栈开发应用程序的企业,更愿意雇用那些熟悉那类堆栈能够立马开展工作的软件开发人员。
基础数据库知识
即使数据库的景色在过去几年时间里已经改变了不少,但我不认为数据库会很快消失,因此对此了解一二总是不会错的,对吧?
当前主要有两种数据库技术:关系数据库和文档数据库。
现在的开发人员至少应该熟悉关系数据库,并稍微了解文档数据库。
在软件开发中,数据库经常被用来存储应用程序的数据。
当然,有些团队甚至有专门的数据库开发人员或数据库管理员(DBA),但是这并不能真正允许你不懂至少是基本的数据库知识。
最起码,你应该知道:
数据库如何工作
如何执行基本的查询来获取数据
如何插入、更新和删除数据
如何连接数据集
此外,你可能会想知道如何以编程方式从你的代码与你所选择的平台和/或框架检索和存储数据。
大多数开发者被期待能够编写与数据库进行交互代码。
源代码控制
源代码控制是任何软件开发项目的组成部分。
在我们使用源代码控制之前,我们必须在网络上共享项目的所有文件,或者通过U盘来回查看存储在上面的不同软件版本。
虽然我很不想承认,但我的确不止一次地玩过这个把戏。
但是,我还年轻。我蠢。你却没必要像我这样。
当前,几乎所有专业的开发者人员都被期待懂得如何使用源代码控制来反复检查代码,并希望懂得合并来自多个源的变化。
最基本层面的源代码控制可以让你保持在一个软件项目中对不同的文件所做更改的历史记录。
它还允许多个开发人员在同一时间工作于相同的代码,然后合并这些更改。
具体就不细说了,但你应该知道如何熟练地使用至少一个源代码控制系统,并且你应该熟悉大多数基本的源控制概念。
在当今软件开发领域,几乎所有专业的软件开发团队都会使用某种源代码控制。



构建和部署
现在,大多数软件开发项目都有着某种自动化的构建和部署系统。
有几种不同的软件应用程序,可以帮助软对自动化这两个任务,曾经是手动,当然对于某些团队而言,现在仍然如此。
你问什么是构建和部署?
好问题。
你知道如何写代码,并检入到源控制系统吗?
拥有一些方法来确保代码可在你检入后真正能工作很不错。
这就是构建系统的用武之地。
最起码,构建系统将编译所有代码,并确保没有编译错误。
一个复杂的构建系统可以运行单元测试或用户测试,运行代码质量检查,并提供关于代码库当前状态的一些报告。
部署系统将负责部署代码要么到生产机器要么可能到某种测试环境。
你不必成为这些技术的绝对专家,但是了解至少这些系统如何工作的基础知识,以及构建和部署代码的过程,是非常重要的。
通常情况下,创建和维护构建和部署系统的实际职责属于所谓的DevOps(developer operations的简写)——这个快速增长的领域。
但是,这并不妨碍你至少了解关于这个过程如何工作的基础知识。
测试
曾几何时开发者并没有必要知道太多关于测试的内容。
我们习惯于写一串代码,然后扔给测试人员,让他们去找代码中的各种bug,然后我们再来修复bug。
切不可再如此。
随着越来越多的软件项目开始采用所谓的敏捷过程,(后面再方法这一点中我们再细谈),软件开发人员和测试人员不得不更密切地一起合作。
质量已真正成为了整个团队的责任——我倒是更想说,它一直都是。
随之而来的是,你需要了解一些关于测试的东西。
你至少应该熟悉如下基本术语:
白盒测试
黑盒测试
单元测试(不是真的测试)
边界条件测试
自动化验收测试
一个优秀的开发人员——会在将代码交给别人之前测试自己的代码。
如果你真的想被认为是专业的,并非浪者虚名,那么这一条没有商量余地。
调试
很多新手软件开发人员在调试时都感觉自己像是在用鸡蛋碰石头。
每个人都希望写代码,没错吧?
但好像没有人愿意调试自己的代码?
这就是真相。
大约90%的时间软件开发人员是用来搞清楚到底为什么代码不能正常工作。
我知道你只是想能够整天写新的代码,但是此路不通。
如果你采用如测试驱动开发这样的方法,那么你可能会少花很多时间在调试上,但无论如何,不管你做什么,不管你如何努力,你都不得不学习如何调试代码或其他人的代码。
因此,与其采取一种随意的方式来做一些你不得不做的事情,还不如咬紧牙关竭尽全力学会如何有效地做好这件事情。
方法
有没有被我列出来的需要知道的事情清单吓倒?
好吧,还有一个——但是我保证这是最后一个。
虽然一些软件开发团队才刚开始写代码,不择手段只要完成任务即可,但是大多数团队还是至少遵循某种方法的。
出于这个原因,熟悉一些最常见的软件开发方法背后的基本理念至关重要。
今天,我要说的是瀑布式开发和敏捷开发。
大多数团队会声称他们正在做敏捷。敏捷本身是一个非常松散的概念,但也有一些做法和——原谅我的措辞——固定程序是你应该知道的,如果你不想只是纸上谈兵,想要打造一支敏捷团队的话。
最后
我知道这些内容通通要掌握的话,有点多,而且我仅仅触及了大多数主题表面的东西。
现在,你可能会觉得有点不知所措,面对这些所谓的技术技能一片茫然。
程序员这条路,就是无止境的学习,不断提高!
如果大家有想往前端开发这条路走的,可以加入一起学习与交流,点击:前端开发
更多干货,学习资源,分享给大家
<hr/>如果你是正在学习的前端开发者,在使用JavaScript写代码的时候,大家可以注意以下这些规范准则。
基本上写作的基本准则的每一部分都能应用在代码上:
让段落成为文章的基本结构:每一段对应一个主题。
去掉无用的单词。 .
使用主动语态。
避免一连串松散的句子。
将相关的词语放在一起。
陈述句用主动语态。
平行的概念用平行的结构。
这些都可以用在我们的代码风格上。
让函数成为代码的基本单元。每个函数做一件事。
去掉无用的代码
使用主动语态
避免一连串松散结构的代码
把相关的代码放在一起。
表达式和陈述语句中使用主动语态。
用并行的代码表达并行的概念。
1、让函数成为代码的基本单元。每个函数做一件事。
软件开发的本质就是写作。我们把模块、函数、数据结构组合在一起,就有了一个软件程序。
理解如何编写函数并如何构建它们,是软件开发者的基本技能。
模块是一个或多个函数或数据结构的简单集合,数据结构是我们如何表示程序的状态,但在没有应用函数,数据结构自身不会发生什么有趣的事情。
JavaScript有三种类型的函数:
交流型函数:执行I/O的函数
功能型函数:一系列指令的合集
映射型函数:给一些输入,返回相应的输出
所有有用的程序都需要I / O,并且许多程序遵循一些程序顺序,但大多数函数应该像映射函数:给定一些输入,该函数将返回一些相应的输出。
一个函数做一件事:如果你的函数是I/O敏感,那么就不要把I/O和映射(计算)混杂在一起。如果你的函数是为了映射,那么就不要加入I/O。功能性的函数就违背了这条准则。功能性的函数还违背了另一条准则:避免把松散的句子写在一起。
理想的函数应该是一个简单的,确定的,纯粹功能函数。
给定相同的输入,返回相同的输出
没有副作用
2. 去掉无用代码
简练的代码在软件中也很重要,这是因为更多的代码让bug有了藏匿的空间。更少的代码=更少的含有bug的空间=更少bug。
简练的代码更清晰,是因为它有更高的信噪比:读者可以减少对的语法理解更多的了解它的意义。更少的代码=更少的语法噪音=更多信息的传递。




上面一段代码可以简化为:
constsecret = msg => () => msg;
对于熟悉箭头函数(ES 2015年加入的新特性)的人来说,这段代码可读性增强了。它去掉了多余的语法:括号,function关键词,以及return返回值语句。
第一个版本包含了不必要的语法。对于熟悉箭头语法的人来说,括号,function关键词,和return语句都没有任何意义。它们存在只是因为还有很多人对ES6的新特性不熟悉。
ES6从2015年就是语言标准了。你应该熟悉它了。
去掉无用的变量
有时候我们倾向给一些实际不需要命名的变量命名。原因是人脑在可用的容量内只能存储有限的资源,并且每个变量都必须作为离散量子存储,占据了我们可用的不多的记忆空间。
因为这个原因,有经验的开发者都倾向减少不需要的变量命名。
比如,在大多数情况下,你应该去掉变量,只给创建一个返回值的变量。函数名应该能够提供足够多的信息以显示它的返回值。看下面的例子:




以及:




开发者常常用来减少变量的另一个做法是:利用函数组合以及Point-free 的风格。
Point-free 风格是指:定义函数时无需引用对其操作的参数。常用的point-free风格方式主要是curry和函数组合。
看一个使用curry的例子:




现在看一下inc()函数。注意它并没有是有function关键词,或者=>语法。没有参数列表,因为这个函数内部并没有使用参数列表。相反的,它返回的是如何处理参数的一个函数。
下面我们看一下使用函数组合的例子。函数组合是把一个函数结果应用到另一个函数的处理流程。你可能没有意识到,你其实一直都在用函数组合。当你调用.map()或者promise.then()函数的时候,你就在使用它了。例如,它的大部分时候的基本形态,其实都像这样:f(g(x)).在代数中,这样的组合被写成:f ∘ g, 被称作“g后f”或者“f组合g”。
当你把两个函数组合在一起时,你就去掉了需要存储的中间返回值的变量。我们看一下下面这个可以更简单的代码:




使用仿函数也能实现类似的效果。使用仿函数也能实现类似的效果。下面这段代码就是使用仿函数的一个例子:




其实在你使用promise链时,基本上就是在用这个方法了。
实际上, 每个编程序库都至少有两个版本的实用方法:compose ()把函数从右向左组合,pipe()函数将函数从左向右组合。
Lodash把这两个函数称作compose()和flow()。当我在Lodash里使用它们时,一般都这样引入:




然而,下面的代码更少,而且完成的了同样的事情




如果函数组合对你来说像外星人一样深不可测,而且你也不确定如何使用,那么请认真回顾一下前面的话:
软件开发的本质是写作。我们把模块、函数、数据结构组合在一起,就构成了软件程序。
由此你就可以得出结论:理解函数的工具意义和对象组合,就像是一个家庭手工劳动者要能理解如何使用钻子和钉子枪一样的基本技能。
当你用指令集和中间变量把不同函数组合在一起时,其实就像是用胶布和疯狂的胶水随意的把东西沾在一起。
请记住:
如果能用更少的代码表达相同的意思,且不改变或混淆代码含义,那就应该这样做。
如果可以使用更少变量达到相同目的,也不会改变或混淆原意,那也应该这样做。
3.使用主动语态
主动语态比被动语态更加直接、有力。 — William Strunk,Jr. 《英文写作指南》
命名越直接越好。
myFunction.wasCalled()优于myFunction.hasBeenCalled()。
createUser()优于User.create()。
notify()优于Notifier.doNotification()。
命名断言或者布尔变量时尽量使用是或否的问题形式:
isActive(user)优于getActiveStatus(user)。
isFirstRun = false;优于firstRun = false;。
命名函数使用动词形式
increment()优于plusOne()。
unzip()优于filesFromZip()。
filter(fn, array)优于matchingItemsFromArray(fn,array)。
事件处理
事件处理函数和生命周期的函数是个例外,要避免使用动词形式,因为他们通常是为了说明这时该做什么而不是他们作为主语自身要做了什么。功能应该和命名一致。
element.onClick(handleClick)优于element.click(handleClick)。
component.onDragStart(handleDragStart)优于component.startDrag(handleDragStart)。
这个例子里两种命名方法的第二种,看上去更像是我们尝试触发一件事,而不是对这个事件作出响应。
生命周期函数
假设有一个组件,有这样一个生命周期函数,在它更新之前要调用一个事件处理的函数,有以下几种命名方式:
componentWillBeUpdated(doSomething)
componentWillUpdate(doSomething)
componentWillUpdate(doSomething)
第一种命名使用被动语态。这种方式有点绕口,不如其他方式直观。
第二种方式稍好,但是给人的意思是这个生命周期方法要调用一个函数。componentWillUpdate(handler)读起来就像是这个组件要更新一个事件处理程序,这就偏离了本意。我们的原意是:”在组件更新前,调用事件处理”beforeComponentUpdate()这样命名更为恰当清晰。
还能更精简。既然这些都是方法,那么主语(也就是组件本身)其实已经确定了。调用这个方法时再带有主语就重复了。想象一下看到这段代码时,你会看到component.componentWillUpdate()。这就像是在说“吉米,吉米中午要吃牛排”。你其实不需要听到重复的名字。
component.beforeUpdate(doSomething)优于component.beforeComponentUpdate(doSomething)
Functional mixins 是把属性和方法添加到Object对象上的一种方法。函数一个接一个的组合添加在一起,就像是管道流一样,或者像组装线一样。每个functional mixin的函数都有一个instance作为输入,把一些额外的东西附加上去,然后再传递给下一个函数,就像组装流水线一样。
我倾向用形容词命名mixin 函数。你也可以使用“ing”或者“able”之类的后缀来表示形容词的含义。例如:
const duck = composeMixins(flying,quacking);
const box = composeMixins(iterable,mappable);
4、避免一连串松散的语句
开发者其实常常讲一连串的事件连接成一整个处理过程:一系列松散的语句本来就为了一个接一个而设计存在的。但过度使用这样的流程会导致代码像意大利面一样错综复杂。
这种序列常常被重复,尽管会有些许的不同,有时还会出乎意料的偏离正规。例如,一个用户界面可能会和另外的用户界面共享了同样的组件代码。这样的代价就是代码可能被分到不同的生命周期里并且一个组件可能由多个不同的代码块进行管理。
参考下面这个例子:
constdrawUserProfile = ({ userId }) => {constuserData = loadUserData(userId);constdataToDisplay = calculateDisplayData(userData);  renderProfileData(dataToDisplay);};
这段代码做了三件事:加载数据,计算相关状态,然后渲染内容。
在现代的前端应用框架中,这三件事是相互分离的。通过分离,每件事都可以得到比较好的组合或者扩展。
例如,我们可以完全替换渲染器,而不用影响其他部分;例如,React有丰富的自定义渲染器:适用于原生iOS和Android应用程序的ReactNative,WebVR的AFrame,用于服务器端渲染的ReactDOM / Server 等等。
另一个问题是你无法简单的计算要显示的数据并且如果没有第一次加载数据就无法生成显示页面。假如你已经加载了数据呢?那么你的计算逻辑就在接下来的调用中变的多余了。
分离也使得各个部件独立可测。我喜欢给自己的应用加很多单元测试,并且把测试结果显示出来,这样我有任何改动的时候都能看到。但是,如果我要尝试测试加载数据并渲染的功能,那我就不能只用一些假数据测试渲染部分。正在保存……
我无法通过单元测试立刻获得结果。函数分离却可以让我们能够进行独立的测试。
这个例子就已经说明,分离函数可以让我们能够参与到应用的不同生命周期中去。可以在应用加载组件后,触发数据的加载功能。计算和渲染可以在视图发生变化的时候进行。
这样的结果就是更清楚地描述了软件的责任:可以重用组件相同的结构以及生命周期的回调函数,性能也更好;在后面工作流程中,我们也节省了不必要的劳动。
5.把相关的代码放在一起。
很多框架或者样板程序都预设了一种程序的组织方法,那就是按照文件类型划分。如果你做一个小的计算器或者To Do的应用,这样做没问题;但是如果是大型项目,更好的办法是按功能对文件进行分组。
下面以一个To Do 应用为例,有两种文件组织结构。
按照文件类型分类




按照文件功能分类




按照功能组织文件,可以有效避免在文件夹视图中不断的上下滚动,直接去到功能文件夹就可以找到要编辑的文件了。
把文件按照功能进行组织。
6.陈述句和表达式使用主动语态。
“做出明确的断言。避免无聊、不出彩、犹豫、不可置否的语气。使用“not”时应该表达否定或者对立面的意思,而不要用来作为逃避的手段。”William Strunk,Jr., 《英文写作指南》。
isFlying优于isNotFlying。
late优于notOnTime。
If语句
if(err)returnreject(err);//dosomething...
比下面这种方式更好:
if(!err) {//...dosomething}else{returnreject(err);}
三元表达式
{  [Symbol.iterator]: iterator ? iterator : defaultIterator}
比下面的形式更好:
{  [Symbol.iterator]: (!iterator) ? defaultIterator : iterator}
尽量选择语气强烈的否定句
有时候我们只关系一个变量是否缺失,因此使用主动语法会让我们被迫加上一个!。在这些情况下,不如使用语气强烈的否定句式。“not”这个词和!的语气相对较弱。
if (missingValue)优于if (!hasValue)。
if (anonymous)优于if (!user)。
if (isEmpty(thing))优于if (notDefined(thing))。
函数调用时避免使用null和undefined参数类型
不要使用undefined或者null的参数作为函数的可选参数。尽量使用可选的Object做参数。尽量使用可选的Object做参数。




优于




6、使用平行结构
实际应用中,还有一些额外的问题没有解决。我们可能会重复的做同一件事情。这样的情况出现时,就有了抽象的空间。把相同的部分找出来,并抽象成可以在不同地方同时使用的公共部分。这其实就是很多框架或者功能库做的事情。
以UI控件为例来说。十几年以前,使用jQuery写出把组件、逻辑应用、网络I/O混杂在一起的代码还还很常见。然后人们开始意识到,我们可以在web应用里也使用MVC框架,于是人们逐渐开始把模型从UI更新的逻辑中分离出来。
最终的结构是:web应用使用了组件化模型的方法,这让我们可以用JSX或者HTML模板来构建我们的UI组件。
这就让我们能够通过相同的方式去控制不同组件的更新,而无需对每一个组件的更新写重复的代码。
熟悉组件化的人可以轻易的看到每个组件的工作原理:有一些代码是表示UI元素的声明性标记,也有一些用于事件处理程序和用在生命周期上的回调函数,这些回调函数在需要的时候会被执行。
当我们为相似的问题找到一种模式后,任何熟悉这个模式的人都能很快的理解这样的代码。
结论:代码要简洁,但不是简单化。
刚健的文字是简练的。一句话应该不包含无用的词语,一段话没有无用的句子,正如作画不应该有多余的线条,一个机器没有多余的零件。这就要求作者尽量用短句子,避免罗列所有细节,在大纲里就列出主题,而不是什么都说。-William Strunk,Jr.,《英文写作指南》
ES6在2015年是标准化的,但在2017年,许多开发人员避免了简洁的箭头功能,隐式回报,休息和传播操作等的功能。人们以编写更容易阅读的代码为借口,但只是因为人们更熟悉旧的模式而已。这是个巨大的错误。熟悉来自于实践,熟悉ES6中的简洁功能明显优于ES5的原因显而易见:相比厚重的语法功能的代码,这样的代码更简洁。
代码应该简洁,而不是简单化。
简洁的代码就是:
更少的bug
更加便于调试
bug通常是这样的:
修理起来耗时耗力
可能引入更多的bug
打乱正常的工作流程
所以简洁的代码应该要:
易写
易读
易维护
让开发者学会并使用新技术比如curry其实是值得的。这样做也是在让读者们熟悉新知识。如果我们还是依然用原来的做法,这也是对阅读代码人的不尊重,就好像在用成年人在和婴儿讲话时使用孩子的口吻一样。
我们可以假设读者不理解这段代码的实现,但请不要假设阅读代码的人都很笨,或者假设他们连这门语言都不懂。
代码应该简洁,而但不要掉价。掉价才是一种浪费和侮辱。要在实践中练习,投入精力去熟悉、学习一种新的编程语法、一种更有活力的风格。
代码应该简洁,而非简单化。
希望对你有帮助
Juliaahlv 发表于 2024-1-7 20:12:55|来自:美国 | 显示全部楼层

How do I respond on jinriwenda.com ??

awdrgyjil ??? 2024-1-7 00:58
????????????????,????????
???????????????????,???? ...

Are any moderators around, as I'm struggling to respond to a new thread?  
Could it be that my writing approach is not correct?
Kindly advise.  
With respect.

快速回帖

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则