0%

程序员的练功房

一场由熊节熊总发起的程序员练功房打卡活动。

他说道,80% 的程序员的代码都是无法直视。

谈谈我的想法

看到这个活动,让我想到了一句话 “练拳不练功,到老一场空”,基本功还是要的,不然根基不稳,难成大器。

当然本篇文章主要是个引子,接下来,会有大篇文章跟进学习进度。也算是立个“flag”!

OKR 什么鬼

每每天干日,东风多作怪!

风起时

OKR(objectives and key results),称为目标与关键结果

看到了什么

  • 少即是多
  • 自下而上设定目标
  • 共同参与
  • 保持灵活
  • 敢于失败
  • OKR 是工具,而非武器
  • 耐心、坚定

以上是 OKR 的通用说明,也是实施的参考。当然,也是纯理论,还是别人总结的经验。

想到了什么

减法
就是要聚焦,对优先事物,优先处理。当然,这也是最具有挑战性,毕竟有那么多人和事在催你,不过,这绝对是值得的。

多维度
单一维度的 OKR,必定会带来一定风险。从书中也得到了一些提示,这会带来风险。

参考

Measure What Matters

Algorithm

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。

示例 2:

输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func plusOne(digits []int) []int {
digitsLen := len(digits)
isOver := false

for i := digitsLen - 1; i >= 0; i-- {
if digits[i] == 9 {
digits[i] = 0
if i == 0 {
isOver = true
}
} else {
digits[i] = digits[i] + 1
break
}
}

if isOver == true {
overArr := []int{1}
digits = append(overArr, digits...)
}

return digits
}

Review

This is what modern PHP looks like

Tip

Share

Algorithm

两个数据的交集

给定两个数组,写一个方法来计算它们的交集。

例如:
给定 nums1 = [1, 2, 2, 1], nums2 = [2, 2], 返回 [2, 2].

1
2
3
4
5
6
7
8
9
10
11
12
13
func intersect(nums1 []int, nums2 []int) []int {
result := []int {};
for i := 0; i < len(nums1); i++ {
for j := 0; j < len(nums2); j++ {
if nums1[i] == nums2[j] {
result = append(result, nums1[i])
nums2 = append(nums2[0:j], nums2[j+1:]...)
break
}
}
}
return result
}

就这么简单, 不过确实巩固了切片的用法.

Review

Simple TDD in Laravel with 11 steps is read in this week.
The link https://medium.com/@jsdecena/simple-tdd-in-laravel-with-11-steps-c475f8b1b214

Note: This is TDD for API responses.

It has 11 steps for you, and tell you how to use TDD in Laravel.

Show it.

Step 1: PREPARE LARAVEL TEST SUITE

First, update your phpunit.xml with add code:

1
2
3
4
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
<env name="API_DEBUG" value="false"/>
<ini name="memory_limit" value="512M" />

It means you need sqlite and we use in-memory, it more fast.

Make sure your TestCase.php if prep for it.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

<?php
namespace Tests;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
use Faker\Factory as Faker;
/**
* Class TestCase
* @package Tests
* @runTestsInSeparateProcesses
* @preserveGlobalState disabled
*/
abstract class TestCase extends BaseTestCase
{
use CreatesApplication, DatabaseMigrations, DatabaseTransactions;
protected $faker;
/**
* Set up the test
*/
public function setUp()
{
parent::setUp();
$this->faker = Faker::create();
}
/**
* Reset the migrations
*/
public function tearDown()
{
$this->artisan('migrate:reset');
parent::tearDown();
}
}

STEP 2: WRITE YOUR ACTUAL TEST

STEP 3: CREATE THE URL IN THE ROUTE FILE

STEP 4: DEBUG YOUR CONTROLLER

STEP 5: VALIDATE YOUR INPUTS

STEP 6: RETURN THE CREATED ARTICLE

STEP 7: CREATE THE ARTICLE CLASS

STEP 8: RUN PHPUNIT AGAIN TO SEE WHAT IS GOING ON

STEP 9: CREATE THE DATABASE TABLE

STEP 10: RUN THE PHPUNIT AGAIN

STEP 11: RUN PHPUNIT AND HOPE FOR THE BEST

Tip

其实也不算是 Tip 吧, 就是今天发现维基百科虽然有中文和英文不同的版本, 但是相同的内容, 中英文不同的版本, 内容差距真的是好大的说.

来看下实例

测试驱动开发

Test-driven development

论学好英语的重要性

Share

极限编程

极限编程的主要目标在于降低因需求变更而带来的成本。在传统系统开发方法中,系统需求是在项目开发的开始阶段就确定下来,并在之后的开发过程中保持不变的。这意味着项目开发进入到之后的阶段时出现的需求变更(而这样的需求变更在一些发展极快的领域中是不可避免的)将导致开发成本急速增加。

极限编程透过引入基本价值、原则、方法等概念来达到降低变更成本的目的。一个应用了极限编程方法的系统开发项目在应对需求变更时将显得更为灵活。

极限编程方法的基本特征是:

  • 增量和反复式的开发 - 一次小的改进跟着一个小的改进。
  • 反复性,通常是自动重复的单元测试,回归测试。参见JUnit。
  • 结对程序设计
  • 在程序设计团队中的用户交互(在场的客户)
  • 软件重构
  • 共享的代码所有权
  • 简单
  • 反馈
  • 用隐喻来组织系统
  • 可以忍受的速度

目前还是无法探讨极限编程的具体意义. (算是在这儿埋个坑吧!)

Algorithm


只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1

千辛万苦完成的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func singleNumber(nums []int) int {
lens := len(nums)
res := 0
resIsOk:
for i := 0; i < lens ; i ++ {
if i == lens-1 {
res = nums[i]
break resIsOk
}
for j := i + 1; j < lens; j ++ {
if nums[i] == nums[j] && i != j{
nums[i+1], nums[j] = nums[j], nums[i+1]
i++
break;
}
if j == lens-1 && nums[i] != nums[j] {
res = nums[i]
break resIsOk
}
}
}
return res
}

个人感觉算法蛮好的了

这个可以有

按位异或赋值运算

位操作一直算是本人的弱项, 学习了新的操作方法

1
2
3
4
5
6
7
8

func singleNumber(nums []int) int {
res := 0
for _, n := range nums {
res = res ^ n
}
return res
}

Review

本周在 golang 的一个中文社区进行 Iris 框架文档翻译。 传送门

希望不要误人子弟。本人很多也是多次斟酌,并且还参考了在线翻译, 以及维基百科。尽量做到好理解,不出错。(原谅本人英文水平确实有限)

Tip

在学习 golang 的途中不知死活

New 和 Make

make

The make built-in function allocates and initializes an object of type slice, map, or chan (only). Like new, the first argument is a type, not a value. Unlike new, make’s return type is the same as the type of its argument, not a pointer to it.

new

The new built-in function allocates memory. The first argument is a type, not a value, and the value returned is a pointer to a newly allocated zero value of that type.

对比官方文档, 我们不难看出它们都是内置函数, 并且 new 返回的是指针, 而 make 返回的该类型.

比较重要的是, make 仅仅适用于 slice, mapchan

而是 new 并不常用, 我们通常都是采用短语句声明以及结构体的字面量达到我们的目的

1
user := users()

Share

本周,让我们谈谈关于学习方面的事。

最近一直在学习,并且不断的搜集不同的学习资料。这种行为真的就像松鼠一样,囤积了好多的书以及网盘资料,但是根本就没有时间去看去学习。

一天会抽出大量的时间用来学习,但是发现效果确实是不咋地。为什么会出现这样的情况呢,我仔细的想了想。

  • 学习的目的是什么?
  • 学习的效率如何呢?
  • 学完后,你还记得什么?
  • 是否真的能在实践中应用到?

答案差强人意,就拿人工智能来说吧,这个确实很火,而且薪资应该也算不低了。我花费时间来学习,是否真的明白自己在做什么,好像并不知道,就因为人工智能火吗?那火的东西多了,为啥偏偏学他呢?那学习后的,我还记得什么,oh,shit。我竟然连昨天做的什么都忘了。

说到这儿,我就不继续往下探究了。看来我是真的为了学习而学习了,不明白到底为了什么学习。好吧,接下来,我就该为自己制定详细的目标和计划。从第一步做起,我到底是为了什么?你真的明白吗?