编程并不容易,编码很容易。

在我的生活中,有一段时间我第一次开始整个编程工作,当时我想:“编程很容易……为什么您需要上学才能学到这些东西?”,但是通过经验和教育,我知道编程很难

不知道编程是否容易,或者我什么都不知道。 〜MemeGenerator.net

自我评估一直对我很重要,因为归根结底,别人的想法无关紧要,对您的想法也很重要。 在评估过程中,我考虑了优势,劣势,教育,培训和个人成长。 这个过程使我能够反思,学习和思考成为程序员的意义。

评价:编码? 编程? 重击键?

在技​​术行业的第一份工作中,我专注于HTML,CSS和JavaScript,目的是使元素做事或创造一些视觉吸引力。 在这段时间里,我从来没有真正把自己当作一个程序员,那时我从来没有真正想成为一个程序员。 不久之后,我想到了如何在NodeJS,PHP和MySQL中执行更多操作,就此开始思考自己。 作为一名程序员,我的想法更加复杂,我在像“软件工程师”这样的程序员那里找到了第一份工作,每天我都在积极地对解决方案进行编程。

“经验告诉我,我正在大力挥洒,砍砍和敲击钥匙,但我没有编程。 ”

编程需要的思想和各种数据类型,结构的认识和理解技术是编程语言建成服役。 区别主要在于完成某些任务时所使用的过程。 重点不在数据类型,设计模式,算法类型,性能或与代码和应用程​​序质量有关的任何内容上。 取而代之的是,它被投入到实际的工作机制和机制的美学之中,而这往往在很多时间里就变成了无法维护的大型野兽。 一直将输出运行到各个地方,并狂热地测试该输出,直到它与某个功能非常相似为止。 如果有什么让我感到自己正在编程的感觉,但是我的方法并不务实或考虑周到。

关于数据的思考

数据结构是我感到教育不足的一个领域。 数据结构背后的想法是,您可以使用不同的方式来存储,调用,排序和搜索数据。 刚开始编程时,我从未想过各种数据任务以及数据类型的性能。 通常,默认情况下对于需要存储,排序或迭代的所有内容,默认使用数组(包括哈希,json,字典和其他用于键值数据集的术语)

从计算机科学的角度来看,集合,堆栈和队列对我来说很有趣,但是实际上在ruby 编程语言中看到了一些实际的作用之后,对我却没那么有趣。 在我看来,堆栈和队列是同一回事,它们使您可以从数据的末端获取信息,队列的例外是您只能按它们加入的顺序来获取项目。 刚想到时,我想到将其放入列表中以等待处理,并减少可以在后台运行的任务的开销。 实际上,将其以像Ruby这样的高级编程语言进行实践并没有多大意义,因为它基本上只是将元素推入或移出数组。

例如,Ruby中的堆栈可以像下面的代码一样简单。

class Stack
# init stack
def initialize
@set = Array.new()
end
# put a new item at the end of the stack
def push(x)
@set .push x
end
# get the last item in the stack
def grab
@set .pop
end
# is the set empty true false bool
def empty?
@set .empty?
end
end
# implemented stack 
s = Stack.new
s.push 'a'
s.push 'b'
s.push 'c'
s.inspect #<Stack:0x48b66454 @set =["a", "b", "c"]>
puts s.grab # "c"
puts s.grab # "b"
puts s.grab # "a"
s.grab.inspect # nil

队列在创建的数据类型上相对相同,再加上Ruby已经有一个用于该类的类

# ruby Queue Class 
q = Queue.new
q << 'a'
q << 'b'
# Tests Examples using Queue 
puts q.length  # prints 2 
puts q.pop # prints a
puts q.length # prints 1
puts q.pop # prints b
puts q.length #prints 0

虽然很简单,但它基本上是一个非常简单的数组。 那本身可能就是它的美。 我看到自己可能在命令行脚本中使用堆栈或队列,但是我不确定我还能在其他什么地方使用它们。

二进制搜索树之所以吸引我,是因为搜索时间和检索数据的速度。 我经常发现从数组中获取数据确实很容易,但是随着数组搜索量的增加,这需要时间。 那就是二叉搜索树起作用的地方,我真的很喜欢哈佛制作的这段视频 。 尽管我并没有做任何事情来使用其中之一,但我真的很想使用它来实现一些东西,然后将其与带有数组的本机ruby方法进行比较,以了解二叉树比简单数组或哈希表快多少。 在我对二叉树的研究中,并试图找到实际的实现和用例,我发现了这些有趣的文章。

可维护性

我的第一个Web应用程序对于可维护性非常可笑。 我没有使用任何代码约定,没有设计模式,没有定义方法的顺序,没有名称空间,也没有对象或模型。 如果我不得不回过头来修复错误(我确信它已经修复了),那么重写它可能比找出导致该错误的方法实际存在的位置要快得多。

可怜的设计导致意大利面条代码。

我很难克服的一个问题是嵌套条件和循环。 这些循环通常会有大量的if语句和验证,但是这个问题是另一个问题的系统性问题。 不了解如何正确组织和分隔程序的各个部分。 我试图用大型方法做所有事情,而不是专注于可以在哪些地方重用或创建块,作为将功能扩展到所有对象和方法的模块。 下面的代码是一个实际的代码段,该代码段被截断并稍作修改以节省长度。

print " <h3> Display Weekdays: </h3> ";
// Looping in a view ... should have been factored diff
foreach($imageRecords["display"] as $ => $displayRecords) {
// WTF is this a nested foreach
foreach($displayRecords as $value => $dispRecord){
$tempWeekdayValuesArray = array();
if($value === "weekdays" && !isnull($dispRecord)) {
// 3rd nested foreach WTF!
foreach($dispRecord as $weekday => $weekbool) {
// :( condition foreach day ::SHAME::
if($weekday == "monday" && $weekbool == 1) {
// logic removed
}
}

}
}
}

我不会将责任推卸给其他人,此代码是我的错误代码,我会坚持的,但是代码导师或通过代码审阅和拉取请求可以缓解其中的某些问题。 回顾这段代码,我感到很ham愧,但这是一件好事,因为它显示了我作为一名开发人员已经成长了多少。 自由在某种意义上是我们遇到的问题,而在其他意义上则不是。 例如,对于这个项目,我不得不使用LAMP堆栈,这是不可协商的,但同时这实际上是唯一的限制。 我不必使用设计模式,遵循任何样式指南,无需使用代码linter或遵循有关代码约定的任何策略。 这样就创建了一个系统,您可以在其中自由使用自己的设备,并且如果您还没有了解应用程序的寿命和错误修复程序,那么它会损害您的最终结果。

我已经变得非常欣赏文本编辑器,并且通过在编写代码时减少(指出潜在的错误)您的代码可以节省多少费用,但是我也已经真正地欣赏与编程相关的更小细节。 遵循文档标准,明确的约定和样​​式指南的编写良好的代码库与电子邮件或Internet文章一样流利地阅读。 (有时会使用所使用的编程语言会更好)。通常,我还发现,我喜欢《 干净代码:敏捷软件技巧手册》(由Robert C. Martin 和其他作者所著)中的许多原理

测试驱动开发

在我看来,测试驱动开发的好处足以证明其优点,但我知道并非所有人都同意测试为代码库提供任何价值。 我不会争论测试的有效性,但是我确实想分享它如何帮助了我。 在实际创建代码之前编写代码的集成和单元测试已经在许多方面有所帮助。 它帮助我编写了更简洁的代码,有效地编写了代码,并帮助我解决了难以解决的问题。

编写更干净,更高效的代码与编程中的许多事情交叉。 可读性,性能和编写时间是TDD帮助我的主要领域。 我发现,我能够编写无需重构(多次)的代码,即可投入生产或版本控制。 它不仅帮助我减少了错误,而且帮助我花了很多时间查找并修复错误。 修复错误后,我发现我可以接受预期的输入或输出,编写与之匹配的测试,然后努力使该测试和所有其他测试通过。 这样可以消除错误,并使代码保持其预期的目的。

在开始编写实际的方法或对象之前,TDD帮助我整理了思路。 在更复杂的功能中,它可以帮助我将功能分解为功能正常工作所需的最少项目集。 通常,它使我想起编写错误或伪代码的原因,因为您的测试将失败,并且最终必须随着代码的演变而更改。 话虽如此,边缘案例就是边缘案例,在最初创建代码时通常很难想到它们。 最终,我觉得测试驱动开发有助于使我成为一个更好的程序员。

From: https://hackernoon.com/programming-isnt-easy-coding-is-a1efcf97a264

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值