ทำไมผมถึงไม่อ่านอีเมล์ในตอนเช้า (และทำไมคุณไม่ควรอ่าน)

ชีวิตพนักงานออฟฟิศคงหลีกเลี่ยงกับการใช้อีเมล์ไม่ได้ โดยเฉพาะคนที่ต้องติดต่อกับคนที่อยู่ในต่างประเทศอยู่เรื่อย ๆ นั้นอีเมล์มีความสำคัญสูงมาก ๆ ส่วนตัวผมเมื่อตอนทำงานใหม่ ๆ ผมเป็นคนเสพย์ติดอีเมล์ ผมเช็คเมล์ทุก ๆ ครึ่งชม. แถมกดรีเฟรชแล้วรีเฟรชอีก ก็จนโดนตำหนิว่าจะเช็คอีเมล์ทำไมบ่อย ๆ นั่นแหละ 555

ปัจจุบันผมเลือกที่จะเช็คอีเมล์หลังเที่ยง (ปรกติก็บ่ายสองโมง) และถ้าจำเป็นต้องตอบโต้ ผมจะตอบเมล์ในช่วงเย็น ๆ ก่อนกลับบ้าน (ประมาณสองทุ่ม) ยกเว้นแต่ถ้ามีคนเดินมากำหนดระยะเวลานั่นแหละที่อาจจะทำนอกเวลาบ้าง แต่ก็จะไม่เช็คเฉพาะเมล์ที่ถูกระบุมา

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

ในอีกความหมายหนึ่ง สารที่เร่งด่วน ไม่ควรส่งทางอีเมล์ วิธีที่ดีกว่าก็คือการคุยปากต่อปาก (และการโทรศัพท์คุยกัน) ในกรณีที่แย่ที่สุด Instant Messaging ก็เป็นทางเลือกที่ดี เพราะเมื่อเทียบกับอีเมล์ที่ต้องใช้เวลากว่าจะถึงผู้รับ IM นั้นแทบจะแสดงผลขึ้นมาทันทีทันใด

แต่นั่นก็ยังไม่เกี่ยวกับการอ่านอีเมล์ตอนเช้าอยู่ดี มันบอกแค่ว่าอีเมล์รอได้ และถ้าคนส่งคิดว่าตัวเองรอไม่ได้ ก็ควรใช้วิธีอื่นช่วย

ทีนี้ จากการวิจัย และจากประสพการณ์ส่วนตัว ทั้งของผมและจากตำราหลาย ๆ เล่ม จะพบว่า ช่วงเวลาทำงานที่เราจะ productive ที่สุดก็คือช่วงเช้า เพราะว่าเรายังไม่ได้เริ่มทำงาน (ฮา) ดังนั้นตอนเช้าจึงเป็นเวลาที่เราควรทำกิจกรรมที่สำคัญที่สุดของวัน และนั่นไม่ใช่การเช็คอีเมล์ เพราะอีเมล์รอได้ … สำหรับกิจกรรมที่สำคัญที่สุดของแต่ละคนก็คงจะไม่เหมือนกัน ส่วนตัวผมจะเริ่มจากการชงกาแฟ เป็นการรวบรวมสมาธิก่อนเริ่มงาน … ไม่ใช่ละ จริง ๆ การเริ่มงานของผมจะเริ่มจากตอนที่อยู่ที่บ้าน ระหว่างเดินทางถ้ามีจังหวะที่มีเวลาให้คิดผมจะเริ่มคิดถึงเรื่องงานว่าวันนี้จะทำอะไรบ้าง เป็นการวางแผนงานก่อนล่วงหน้ามาก่อนโดยอ้างอิงจากการรับงานมาในวันก่อนหน้า ผมจะเริ่มจากงานที่ยากและน่าสนใจเอาไว้อันดับแรก ๆ

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

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

สภาวะทางอารมณ์มีผลกระทบอย่างมากต่อประสิทธิภาพในการทำงาน ถ้าคุณทำงานด้วยความรู้สึกสดชื่น งานจะออกมาดี แต่ถ้าคุณกำลังโมโหสุดขีด งานคุณจะไม่คืบ เพราะคิดอะไรไม่ออก ทำอะไรก็ผิด ดังนั้นการควบคุมสภาวะทางอารมณ์นั้นเป็นเรื่องสำคัญ มันเป็นตัวชี้ได้เลยว่าใครทำงานเป็น ใครทำงานไม่เป็น ทั้งนี้ถ้าคุณคิดว่าตามปรกติคุณสามารถควบคุมตัวเองได้ แต่คุณดันอยู่ในสภาพแวดล้อมที่ทำให้สภาวะทางอารมณ์คุณแปรปรวน (เช่น เพื่อนร่วมงานไม่เคารพในสิทธิของคุณ) บางทีก็ควรคิดถึงการเปลี่ยนสภาพแวดล้อมของตัวเองไว้ด้วยก็ดี (ยิ่ง open office เนี่ยตัวดีเลย)

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

ทีนี้ มันจะมีบางกรณีที่ว่าถ้าเราไม่อ่านอีเมล์ในตอนเช้า เราจะพลาดสารที่มีใจความสำคัญบางอย่าง เช่นอาจจะมีคนส่งเมล์มาบอกว่างานนี้ไม่ต้องทำแล้ว แต่เราดันทำไปแล้วในตอนเช้า (เพราะไม่ได้อ่านอีเมล์) อันนี้ก็ต้องลองดู ส่วนตัวผมคำว่าช่วงเช้าหมายถึงสองชม.แรกของวัน (ประมาณ 10.00-12.00 น.) และเวลาแค่สองชม.ผมสามารถที่จะหมุนเอาเวลาส่วนตัวมาใช้แทนได้ไม่ลำบากมากนัก (เพราะลูกเมียไม่มี 555) อ้อ แล้วผมส่งงานหลังเช็คอีเมล์อยู่แล้ว ดังนั้นไม่ค่อยเจอปัญหาประเภทที่ว่าทำไปแล้วไม่เอาจะเอาออกไงดี อะไรทำนองนี้ ทีนี้มันจะมีกรณีที่เร่งด่วนมาก ๆ บางทีที่ต้องการการลงมือทำในทันทีส่งมาบ้างเหมือนกัน ซึ่ง ถ้าเขาจำเป็นต้องส่งอีเมล์มา ก็ถือว่าโอเค ผมก็จะหมุนเอาสองเวลาส่วนตัวมาใช้แทนเหมือนกัน (แต่จะดีกว่าถ้าเขาทิ้งโน๊ตเอาไว้ให้ หรือส่ง IM มาบอกว่ามีงานด่วนให้ทำตอนเช้า) แต่ถ้าเป็นคนที่อยู่ในออฟฟิศแล้วเลือกที่จะส่งอีเมล์มานี่ผมว่ามันฟังดูแปลก ๆ ละ (เพราะอย่างที่บอกว่าอีเมล์นั้นเป็นการส่งสารที่ใช้เวลา) ถ้าอยู่ใกล้ ๆ กันแต่เลือกที่จะส่งอีเมล์คุยกันนี่ บางทีก็คิดนะว่าเขารังเกียจเราหรือเปล่าเนี่ย พูดกันตรง ๆ ถ้ามีเรื่องเร่งด่วนแต่ดันส่งอีเมล์คุยเนี่ย มันเป็นการละเลยตัวตนของคนคนนั้นวิธีนึงเหมือนกันนะ

คือส่วนตัวผม ถ้ามันมีเรื่องเร่งด่วน ต้องการความสนใจ ผมเดินไปหาเขาเลย (อันที่จริง การเดินในออฟฟิศเป็นเรื่องดีนะ อย่างผมเป็นพวกนั่งเฉย ๆ แล้วจะนึกอะไรไม่ออก ต้องเดินไปเดินมา) ถ้าตามตัวไม่เจอจะกลับมาที่โต๊ะแล้วโทรหาเบอร์โต๊ะอีกที ถ้าไม่ติดอีกค่อยส่งอีเมล์ (ติดป้ายว่าสำคัญด้วยนะ) ถ้าผมส่งอีเมล์ แปลว่าเรื่องมันรอได้ระดับหนึ่ง และผมจะไม่คาดหวังว่าเขาจะตอบกลับมาทันที (เพราะว่า เอาจริง ๆ นะ ลำพังอ่านเมล์ยาว ๆ ก็ใช้เวลาเป็นชั่วโมงแล้วครับ)

มีครั้งนึงถึงขั้นลงไปดักรอเขากินข้าวเลยล่ะ 555 เขาตีปิงปองเราก็นั่งดู จนเฮฮากันเรียบร้อยนั่นแหละถึงเดินไปคุย (หิวข้าวด้วยนะ ยังไม่ได้กิน) ก็ตลกดี อันนี้ไม่ใช่เรื่องด่วนมากรอได้ สองชม.เอง

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

สรุปว่า ที่ผมไม่อ่านเมล์ในช่วงเช้าเป็นอย่างแรก เพราะว่า
1. ผมต้องการที่จะทำงานที่สำคัญที่สุด ตามที่วางแผนเอาไว้ ในช่วงเวลานั้น
2. ผมไม่ต้องการที่จะอารมณ์เสียตั้งแต่เช้า ซึ่งจะมีผลต่อประสิทธิภาพการทำงานไปตลอดวัน

ก็ไม่รู้ว่ามันจะดูเข้าท่า หรือว่าไร้สาระสำหรับผู้อ่านทั้งหลายหรือเปล่านะ เผลอ ๆ ถ้าทำจริง ๆ อาจจะโดนตำหนิได้ (ผมก็เพิ่งมาโดนตำหนิเอาช่วงหลังนี่เหมือนกัน 555) ก็ลองพิจารณาดูละกันนะครับ

[C++] Variadic Template กับการสร้างวัตถุที่มี constructor parameter ที่แตกต่างกัน

ในเอนจินที่ผมพัฒนาอยู่เนี่ย มันจะมีการทำ command list โดยอารมณ์มันจะเหมือนกับ virtual machine ง่าย ๆ ตัวนึงครับ โดยผมเขียนคลาสขึ้นมาตัวนึงคือ Command มีหน้าตาแบบนี้

class Command
{
public:
    virtual void Execute(const Scene* &pScene) = 0;
};

และก็มีคลาสที่เป็น Command อื่น ๆ อีกมากมาย (ตอนนี้มีประมาณ 10 คลาสแล้วครับ และไม่มีทีท่าว่าจะลด 555) ที่สำคัญคือแต่ละคลาสนั้นมี constructor ที่หน้าตาไม่เหมือนกันเลย เช่น ผมมี

class MessageCommand : public Command
{
public:
    MessageCommand() = delete;
    MessageCommand(const std::string& text);
}

class ShowDrawableCommand : public Command
{
    ShowDrawableCommand() = delete;
    ShowDrawableCommand(const pgengine::drawable& object);
}

ในคลาส Scene ผมจะมี command list อยู่ตัวนึง ซึ่งเป็น std::list ของ pointer ที่ชี้ไปยังคลาส Command ด้วยเหตุผลที่ว่าผมใช้หลัก poloymorphism ในการออกแบบคลาสชุดนี้ เมื่อก่อนถ้าเกิดผมออกแบบคลาสชุดนี้ผมก็คงจะเขียนฟังก์ชั่น AddCommand() โดยรับพารามิเตอร์เป็น Command* ซึ่งก็ง่ายดี แบบนี้

void AddCommand(const Command*& command)
{
    commandList.push_back(command);
}

แต่วิธีนี้ก็สร้างปัญหาเกี่ยวกับการจัดการ lifetime ของวัตถุ และความเป็นเจ้าของ (ownership – โดยหลัก ๆ ก็ใครจะเป็นคนทำลายวัตถุนั้นๆ) ซึ่งก็กลายเป็นเรื่องวุ่นวายขึ้นมาได้อีก

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

และที่สำคัญคือ เราไม่สามารถใช้ Template ธรรมดามาช่วยตรงนี้ เพราะว่าในภาษา C++98 นั้นระบุว่าต้องระบุว่า template class/function นั้น ๆ จะมีกี่ type ก็คือ ต่อให้เขียนฟังก์ชั่นที่รับ type ที่แตกต่างกันในแต่ละพารามิเตอร์ได้ ก็ต้องระบุอยู่ดีว่าจะเป็น type อะไร

แต่พอดีว่าเราไม่ได้อยู่ในปี 1998 แล้ว ปีนี้เป็นปี 2014 3 ปีหลังจาก C++11 ถูกสร้างเสร็จ ก็จะแนะนำฟีเจอร์หนึ่งที่เรียกว่า variadic template ก็พูดกันง่าย ๆ คือ template class หรือ function ที่ไม่ระบุจำนวน type ที่แน่นอน สำหรับ syntax นั้นก็ใกล้เคียงกับ variadic function ก็คือจะใช้ ... ในการบอกว่ามี type ไม่ระบุจำนวนอยู่ใน template parameter list

ยกตัวอย่าง variadic template function สักหนึ่งตัว …

template<class ...T> void Print(T ...param);

(เอาจริง ๆ ผมก็ยังเขียนไม่ค่อยเป็น 555)

ก็เรียกใช้ฟังก์ชั่นนี้แบบข้างล่างนี้ได้หมดเลย

Print();
Print<int>(10);
Print<char, std::string>('a', "Hello World");

อะไรก็ว่ากันไป

ที่เด็ดกว่านั้นก็คือ เราสามารถเอา variadic template function มาใช้คู่กับ class/function ธรรมดาได้ด้วย อย่าง …

template<class Type, class ...ParamType>
void DoSomething(Type obj, ParamType ...param)
{
    obj.perform(...param);
}

ซึ่ง obj.perform() นั้นจะสามารถถูกเรียกได้โดยที่ไม่เกี่ยวกับว่ามี type เป็นอะไร ขอแค่ obj นั้นมีฟังก์ชั่น perform() และใส่ parameter เข้ามาครบก็ถือว่าโอเค (ถ้าใส่ไม่ครบจะคอมไพล์ไม่ผ่าน)

เช่น

class A
{
public:
    void perform();
};

class B
{
public:
    bool perform(const std::string&);
}

A a;
B b;

DoSomething(a);
DoSomething(b, "Hello World");

อะไรทำนองนี้

่ส่วนตัวผมใช้เทคนิคนี้กับฟังก์ชั่น AddCommand ข้างบน แบบนี้

template<class Type, class ...ParamType>
void AddCommand(ParamType... param)
{
    commandList.push_back(new Type(...param));
}

AddCommand<MessageCommand>("Hello World");
Drawable drawable;
AddCommand<ShowDrawableCommand>(drawable);

กลายเป็นว่าผมเขียนฟังก์ชั่นทีเดียวแต่ใช้กับกี่คลาสก็ได้ สบายแฮ