程式設計師防騙指南:如何統計自己的加了多少班

Pengfei-Gao發表於2017-12-08

最近因為個人原因離職,換了份工作,在和上一家公司結算工資的時候出了些bug,我個人感覺我平時加班還是比較多。每週加班最少四天,有時候甚至6天。我今年也是剛畢業來北京,雖說之前在學校有做過兩年外包,但依舊單身。所以也沒什麼事,加班使我快樂,即能打發週末的無聊,也能混一天50塊錢的加班餐補,而且還為公司專案作出了貢獻,何樂而不為呢,總之一句話,加班使我快樂。但是這個加班是不給加班費的,意思就是可以調休假,年底的時候可以折算成工資。

後來,我幹到第五個月的時候,因為個人原因,我就離職了。不要問我為什麼,有一個男人曾經說過,員工離職無非兩個原因:一是錢沒到位,二是受委屈了。當這兩點同時達到的時候,哪怕是世界上最好的公司,也沒人願意待的。

也就是我離職以後的五號,公司該結算工資了,我發現我的工資居然只比以前多了273塊錢。我瞬間就感覺不可思議。覺得不科學,我哪怕多加班一天,工資也不止200來快啊。而後準備詢問一下公司財務,發現微信被拒收了。而後我又去問人事,人事給我口述一大堆,我讓截圖給我,也是不願意。我就感覺我可能被騙了。

那末問題來了,我如何知道我自己到底家了多少班呢???公司用的是linus開發的git來管理軟體的,當然,我剛去的時候沒人用git,都是我完善起來的。事實證明,這對我日後維權有著莫大的好處。

既然用的是git,那麼我每一次提交程式碼都是有記錄的,一個完整的git記錄內容如下:

commit 78b2c07d52f0c567b8864eb2d0db25eb168822d0
Author: Pengfei-Gao <net.aifei8@gmail.com>
Date:   Thu Nov 16 10:06:16 2017 +0800

    add package-lock.json
...
複製程式碼

我們可以使用git的git log --author=username來列印出我提交程式碼的記錄。然後就是找出我週末的提交記錄,可以把git log的輸出管道重定向到grep,使用grep來找出週末提交程式碼的記錄,像下面這樣子:

➜   git log --author=Pengfei-Gao | grep -E "Wed|Sun" 
Date:   Wed Nov 22 16:04:40 2017 +0800
Date:   Wed Nov 15 16:42:21 2017 +0800
...

複製程式碼

現在問題來了,同一天可能有多次提交,這樣就會出現重複的記錄,對統計造成一些麻煩,所以我們可以用awk來去掉單條記錄的時、分、秒這些欄位,然後用sort -k2n | uniq來去掉重複的記錄,大概像下面這樣子:

➜  git log --author=Pengfei-Gao | grep -E "Wed|Sun" | awk -F ' ' '{print $1,$2,$3,$4,$6}' | sort -k2n | uniq                      
Date: Sun Aug 20 2017
Date: Sun Aug 6 2017
Date: Sun Sep 24 2017

複製程式碼

到了這一步,剩下的就是我們加班並提交程式碼的日期了,我們在用awk統計一下記錄數,也就是我們的加班天數,大概像下面這樣子:

➜  git log --author=Pengfei-Gao | grep -E "Wed|Sun" | awk -F ' ' '{print $1,$2,$3,$4,$6}' | sort -k2n | uniq | awk 'END{print NR}'
17
複製程式碼

也是說,我為了維護這個專案,總共加班17天。那麼在很多情況下,一個公司裡面同一個人沒可能要去維護好幾個專案,這種情況該怎莫辦呢?我們可以將所有專案的提交記錄全部寫入同一個名為commit_log的檔案,然後像下面這樣子:

➜   cat commit_log | grep -E "Wed|Sun" | awk -F ' ' '{print $1,$2,$3,$4,$6}' | sort -k2n | uniq | awk 'END{print NR}'
複製程式碼

就可以統計出你為了維護公司所有的專案所加班的天數了。我寫了一個簡單的shell指令碼,名為count_my_overtime,內容如下:

#!/bin/bash
projects=$(ls -F | grep '/$')

for project in $projects; do
    # cursor
    cd $project && git log --author="$1" 1>> $(pwd)/../overtime_log
    cd ..
done

overtime_num=$(cat overtime_log | grep -E "Wed|Sun" | awk -F ' ' '{print $1,$2,$3,$4,$6}' | sort -k2n | uniq | awk 'END{print NR}')
echo "A: congratulations, $1. You have worked overtime about $overtime_num days"

rm overtime_log -f
複製程式碼

使用方法特別簡單,將你維護的所有專案全部放在統一目錄下,然後執行如下命令即可:

./count_my_overtime [you-user-name]
複製程式碼

剛才把證據拿給我們人事看了以後,我們人事說:”只有自個申請加班,並且領導簽字同意了的才算加班“。也就是說我這17天白乾了。加上我國慶中秋加班兩天,也就是說,白乾一個月(總共是17+2X3=23天的工作日,注意:勞動法規定,一個月的工作日只有21天),

相關文章