ในวันศุกร์ที่ผ่านมาผมขอความช่วยเหลือคุณภัคชุดา วสุวัต (ยุ้ย) ซึ่งเป็นผู้ประสานงานของสำนัก 7 ของ สสส. ให้ช่วยส่งรายการอีเมลของภาคีของ สสส. มาให้ผมเพื่อผมจะได้ใช้ในบริการหนึ่งที่โครงการ Digital KM ของเราได้สร้างเพื่อภาคีต่างๆ ครับ

คุณยุ้ยส่งมาให้ผมเป็น Microsoft Word ไฟล์ โดยในไฟล์นั้นมีตารางประกอบด้วยชื่อภาคีและอีเมลติดต่อ ในขณะที่สิ่งที่ผมต้องการเพื่อโปรแกรมของผมคือไฟล์ (text file) ที่มีรายการอีเมลเรียงหนึ่งอีเมลต่อหนึ่งบรรทัดครับ

เพื่อจะให้ได้เป็นผลลัพธ์ที่ผมต้องการนั้น มีวิธีการทำอยู่สองวิธีครับ คือใช้ "คน" และใช้ "เครื่อง"

วิธีใช้ "คน" คือให้ นศ. ฝึกงาน copy อีเมลออกมาจากไฟล์ทีละอีเมลจนครบ ในขณะที่ copy ออกมานั้นก็ให้ดูด้วยว่ามีอีเมลซ้ำหรือไม่จะได้ไม่ใส่รายการอีเมลซ้ำในไฟล์

ส่วนวิธีใช้ "เครื่อง" คือการเขียนโปรแกรมดึงอีเมลออกมาจากไฟล์ โดยโปรแกรมนั้นตรวจสอบว่าอีเมลที่ดึงมาแต่ละอันซ้ำกันหรือไม่ด้วย

วิธีไหนง่ายกว่ากันครับ?

คำถามนี้ตอบยากครับ การใช้คนย่อมง่ายกว่าแน่ แต่จะใช้เวลามาก และปัญหาที่จะตามมาคือเรื่องการ copy อีเมลจำนวนสามร้อยกว่าๆ รายการนั้นย่อมไม่ใช่เรื่องสนุก ความผิดพลาดย่อมเกิดขึ้นได้แน่นอน

ส่วนการใช้เครื่องนั้นในกรณีเช่นนี้กลับทำได้ง่ายกว่า

ผมเปิดไฟล์โดยคลิกใน Gmail ตรง "View as HTML" แล้ว save ไฟล์นั้นลงในเครื่องผม ด้วยวิธีนี้ผมแปลง Word file เป็น HTML file แล้ว

ขั้นต่อไปผมเขียนโปรแกรมเพื่อดึงเฉพาะอีเมลออกมาจาก HTML file นั้น ดังนี้

#! /usr/bin/env perl

%h = ();
while (<>) {
    if (/mailto:([^"]+)/) {
        $email = $1;
        unless ($h{$email}) {
            print lc($email) . "\n";
            $h{$email} = 1;
        }
    }
}

ที่จริงโปรแกรมนี้มีความยาวเพียงสิบบรรทัด แต่ผมใส่คำอธิบายไว้ด้วยทำให้ยาวขึ้น (คำอธิบายโปรแกรมคือบรรทัดที่เริ่มต้นด้วยเครื่องหมาย #) ดังนี้

#! /usr/bin/env perl
# define a hash for duplication checking
%h = ();
# loop over each line received from STDIN
while (<>) {
# check the line with a regular expression to extract
# an email address from it
if (/mailto:([^"]+)/) {
# save the extracted email to $email
$email = $1;
# if the email is not in the checking hash
unless ($h{$email}) {
# lowercase the email and print to STDOUT
print lc($email) . "\n";
# save the email to the checking hash
$h{$email} = 1;
}
}
}

แล้วเรียกใช้โปรแกรมนี้ในเครื่องคอมพิวเตอร์ผมซึ่งใช้ระบบปฎิบัติการ Ubuntu เช่นนี้

./thf_emails.pl <thf_partners.html > thf_partners.txt

ผมก็ได้รายการอีเมลทั้งหมดของภาคี สสส. โดยไม่ต้องให้ นศ. ฝึกงานช่วยผมทำ ซึ่งกระบวนการทั้งหมดผมใช้เวลาไม่เกินครึ่งชั่วโมง และเมื่อรายการอีเมลมีการเปลี่ยนแปลงในอนาคต ผมจะใช้เวลาเพียงไม่กี่นาทีหลังจากได้รับไฟล์ใหม่ เพราะโปรแกรมเขียนเสร็จแล้วตั้งแต่ครั้งนี้

นี่คือ "อานุภาพของคอมพิวเตอร์" ครับ

คอมพิวเตอร์คือเครื่องมือที่มีให้เราประยุกต์ใช้เพื่อลดเวลาในการทำงานที่เป็นงานไม่ได้ใช้ความคิดในการทำงาน งานเหล่านั้นได้แก่งานที่เป็นงาน routines ทั้งหลายครับ

หัวใจของผู้เรียนวิทยาการคอมพิวเตอร์หรือวิศวกรรมคอมพิวเตอร์คือ เมื่อพบงาน routines สักอย่างหนึ่ง เขาต้องช่างคิดเพื่อตอบให้ได้ว่า

"มันต้องมีวิธีที่ง่ายกว่านี้และเร็วกว่านี้"

คอมพิวเตอร์ในปัจจุบันมีศักยภาพในการทำให้งานที่ต้องทำซ้ำๆ และไม่ใช้ทักษะความคิด (หรืองาน routines ทั้งหลาย) เป็นงานอัตโนมัติได้หมดแล้ว (เพื่อให้มนุษย์ได้ทำงานที่ใช้ความคิดมากกว่า)

แต่จะทำได้ดังนั้นก็ต้องอาศัยทักษะในการประยุกต์ใช้โปรแกรมหรือเขียนโปรแกรมแก้ไขปัญหา ซึ่งทักษะเหล่านี้ไม่ใช่เกิดขึ้นภายในชั่วข้ามคืน แต่เกิดจากการฝึกฝนมาอย่างยาวนาน

ที่ผมเขียนโปรแกรมแก้ไขปัญหานี้ได้ภายในเวลาอันสั้นไม่ได้หมายความว่าผมเก่ง แต่หมายความว่าผมฝึกฝนเขียนโปรแกรมอย่างต่อเนื่องมาตลอด 20 ปีตั้งแต่ผมเริ่มรู้จักคอมพิวเตอร์

ผมเชื่อว่างานเขียนโปรแกรมเป็นแขนงหนึ่งของศิลปะ ซึ่งต้องอาศัยเวลาในการฝึกฝนในทักษะเพื่อให้เข้าถึงซึ่ง "ศิลป์" นี้

ผู้เรียนรู้ในการเขียนโปรแกรมคือผู้ฝึกฝนเพื่อให้เกิดศิลป์ในการทำ R2A หรือ Routines to Automation ครับ

งาน routine ทุกงานสามารถแปลงเป็น automation ได้ทั้งสิ้น ผมเชื่อว่าไม่มีข้อแม้ครับ

เมื่อวันที่ 5 ส.ค. ที่ผ่านมาผมสอนนักศึกษาปีสองเรื่อง "The Art of Programming" โดยบอกนักศึกษาว่าที่ผมพูดนี่นักศึกษาคงยังไม่เข้าใจหรอก เพราะพึ่งเริ่มต้นเรียนรู้การเขียนโปรแกรม แต่เมื่อได้อยู่ในวิชาชีพนี้ไปสักพักก็จะเริ่มซึมซับถึงความหมายเหล่านี้มากขึ้นเรื่อยๆ ตามลำดับ

การได้เรียนรู้ดื่มด่ำกับ "ศิลป์" นี้นับเป็นความสุขอย่างหนึ่งของวิชาชีพนี้ เช่นเดียวกันกับนักเขียน หรือนักดนตรี หรืออื่นๆ และรางวัลที่สำคัญในวิชาชีพนี้คือความสุขในการได้ทำงานศิลป์นี่เอง ก็เหมือนกับผู้ฝึกฝนในศิลปะประเภทอื่นๆ เช่นเดียวกัน

บันทึกนี้เป็นตัวอย่างหนึ่งของ "ศิลป์" ในการเขียนโปรแกรม และหวังว่าแนวคิดของการฝึกฝนเพื่อเข้าถึง "ศิลป์" ในการเขียนโปรแกรมจะได้กลายเป็นส่วนหนึ่งในการเรียนการสอนในวิชาการด้านนี้ครับ