Special Report

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

ทฤษฎีทางความเชื่อเกี่ยวกับภาษาเขียนโปรแกรมจำนวนมาก ได้ถูกกล่าวอ้างโดยไม่ได้รับข้อพิสูจน์ โดยเฉพาะจากเหล่าสาวกของภาษานั้น ๆ บางครั้งเวลาผมอ่านก็เคลิ้มตามไปเหมือนกัน บางครั้งก็อดตั้งคำถามไม่ได้ว่า มันจะจริงเหรอ ???

หมายเหตุ : ขอโฆษณาต้นฉบับหน่อยครับ ที่ BioLawCom.De :D

ผมจึงรู้สึกว่า น่าจะเขียนบล็อกขึ้นมาหนึ่งบล็อก เพื่อเปรียบเทียบคุณสมบัติต่าง ๆ ของภาษาเขียนโปรแกรมขึ้นมาหนึ่งบล็อก เพื่อเปรียบเทียบให้เห็นกันจะ ๆ และพยายามเป็นกลางให้มากที่สุด (อันนี้แหละยาก) เผื่อว่าใครจะเอาข้อมูลไปใช้ประกอบการตัดสินใจ โดยภาษาที่ผมจะนำมาเปรียบมวยมีด้วยกัน 3 ภาษา คือ Java, Python และ Ruby เพราะเป็นภาษาที่ได้รับความนิยมในขณะนี้ และดูที่อนาคตจะไปได้สวย (จริง ๆ อยากเขียน C# เหมือนกัน แต่ดูเหมือน C# จะแผ่วไปเยอะในช่วงหลัง)

อันที่จริงมีคนเปรียบมวย Python กับ Java ไว้แล้วเยอะเหมือนกัน ไม่ว่าจะเป็น Python & Java: Side by Side Comparison
(รู้สึกหน้านี้จะเสีย ลองไปอ่านที่ Google-Cache ดูครับ), C++ vs Java vs Python vs Ruby : a first impression และ Python vs. Perl vs. Java vs. C++ Runtimes แต่ส่วนมากมักเป็นข้อมูลเก่า (ยกเว้น C++ vs Java vs Python vs Ruby : a first impression ข้อมูลค่อนข้างใหม่) ผมจึงอยากอัพเดดข้อมูลบางอย่างเพิ่มเติมลงไป และทดสอบโดยใช้โปรแกรมที่ใกล้เคียงกับการใช้งานจริงมากที่สุด

About me

ก่อนอื่นผมต้องแนะนำตัว เกี่ยวกับพื้นหลังการเขียนโปรแกรมของผมก่อนครับ เพื่อให้คนอ่านใช้ประกอบวิจรณญาณในการอ่าน

ทุกวันนี้ผมทำงานโดยใช้ Python ในการเขียนโปรแกรม Simulation เกี่ยวกับเคเบิลใยแก้วนำแสง ดังนั้น คนอ่านไม่ต้องแปลกใจครับ หากผมจะลำเอียงไปทาง Python แต่ผมจะพยายามรักษาความเป็นกลางไว้ให้มากที่สุดครับ

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

ผมไม่เคยศึกษา Ruby อย่างเป็นเรื่องเป็นราว แต่ก็ผ่าน ๆ ตามาบ้าง โดยการใช้งาน Ruby on Rails ความรู้ Ruby ผมจึงเป็นแบบ งูงู ปลาปลา อย่าถือสากันนะครับ :D

About this fight

การเปรียบมวยครั้งนี้ ผมได้เขียนขึ้นโดยวิเคราะห์จากการเขียนโปรแกรม โปรแกรมค้นหาข้อมูลสำหรับ CMS ซึ่งเดิมทีนั้น ผมเขียนขึ้นโดยใช้ PHP แล้วนำมาเขียนใหม่โดยใช้ Java, Python และ Ruby โดยมีการตัดโค้ดบางส่วนออก และปรับปรุงอีกเล็กน้อย เพื่อให้เหมาะสมกับการทดสอบ

ส่วนการทดสอบความเร็วนั้น ผมได้อ้างอิงตาม Python vs. Perl vs. Java vs. C++ Runtimes โดยมาปรับปรุงสำหรับ Ruby และเพิ่มการทดสอบในกรณีอื่น ๆ เข้าไปอีกเล็กน้อย

ในแต่ละยกผมจะให้คะแนน แต่ละภาษาโดยให้เป็น image ยิ่งมากยิ่งดี โดยมีคะแนนเต็ม imageimageimageimageimage (คิดถึงตอนเรียนอนุบาลเลย)

Round 1 : The first impression

ในยกนี้ผมวิเคราะห์ตามความรู้สึกของผม ที่ได้เขียนโปรแกรมในภาษานั้น ๆ เป็นครั้งแรก ประกอบกับความรู้สึกของเพื่อน ๆ ที่เขียนโปรแกรมภาษานั้น ๆ เป็น

  • Java : image : เป็นภาษาที่เหมาะกับวิศวกรซอพท์แวร์ แต่ไม่ค่อยถูกโฉลกกับคนวงการอื่น ๆ ในครั้งแรกที่เริ่มเขียน Java อะไร ๆ ก็ดูยากไปหมด ผมและเพื่อนทุกคนเห็นพ้องต้องกันตอนเรียน Java ว่า Java ยากกว่า C อีก อีกทั้งตัวภาษาไม่เอื้อต่องานประเภท Quick and Dirty คือลองเขียนเล่น ๆ สั้น ๆ คนที่จะเขียนโปรแกรม Java โปรแกรมแรกได้นั้น ต้องรู้จัก JRE, JDK, class, object, public, static, void, main ก่อนถึงจะเขียนได้ อีกทั้งยังเจอ Concept แปลก ๆ ที่คนที่ไม่เคยเขียน Java มาก่อน ก็ต้องงงไปตาม ๆ กัน เช่น Interface, Abstact Class, Iteration, Type Cast เป็นต้น สรุปคือ กว่าจะเขียน Java เป็นต้องใช้เวลาค่อนข้างนาน
  • Python : imageimageimageimage : คงเหมือนกับภาษา Script ภาษาอื่น ๆ ที่ไม่ต้องรู้อะไรมากก็ลงมือเขียนได้เลย มี Interactive-Console ให้ใช้งาน ลองเล่นไปตามเรื่องตามราว แต่สิ่งที่กวนประสาทมาก ๆ คือ Indent เป็นเรื่องที่ต้องใช้เวลาในการปรับตัวกันนานพอสมควร
  • Ruby : imageimageimageimageimage : ครั้งแรกที่ลองใช้งาน อะไร ๆ ก็ดูง่ายไปหมด หากรู้จักภาษา Script อื่น ๆ มาก่อน Ruby แล้ว การเรียนรู้ Ruby ก็จะใช้เวลาน้อยมาก

Round 2 : Community

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

  • Java : imageimageimageimageimage : เนื่องจาก Java เป็นภาษาที่ได้รับความนิยมสูงสุด มีบริษัทยักษ์ใหญ่จำนวนมากให้การสนับสนุน Java และเลือก Java เป็นภาษาหลักในพัฒนาซอพท์แวร์ของตัวเอง อีกทั้งในขณะนี้ Java กลายเป็น OpenSource เป็นที่เรียบร้อยแล้ว ดังนั้น Community ของ Java จึงแข็งแกร่งไร้เทียมทาน
  • Python : imageimageimageimageimage: Python เป็น OpenSource โดยกำเนิด และเป็นภาษาที่ได้รับความนิยมมากขึ้นเรื่อย ๆ มีองค์กรณ์สนับสนุนอย่างเป็นทางการมากมาย (PSF, Google, Zope) แม้ความนิยมในตัว Python ยังไม่เทียบเท่า Java แต่ความแข็งแกร่งของ Community ก็ไม่ได้เป็นรอง Java แม้แต่น้อย
  • Ruby :imageimageimageimage: แม้ว่า Ruby จะเป็นภาษาที่ค่อนข้องใหม่ แต่ในระยะเวลาสองปีที่ผ่านมา Ruby ได้รับความนิยมเพิ่มขึ้นอย่างรวดเร็ว สาเหตุก็เนื่องมาจาก Ruby on Rails ความแข็งแกร่งของ Community ของ Ruby จึงเพิ่มขึ้นอย่างน่าจับตามอง แม้กระนั้นก็ตาม Community ของ Ruby ยังอยู่ในภาวะสร้างตัว จึงยังไม่แข็งกร่งเท่าภาษาเขียนโปรแกรมรุ่นพี่อย่าง Java และ Python แต่คาดว่าอีกปีหรือสองปี Ruby อาจเทียบชั้นมาตีเสมอได้ไม่ยาก

Round 3 : Library

  • Java : imageimageimageimage : เนื่องจาก Java เป็นภาษาที่ได้รับความนิยมอย่างสูง จึงไม่ใช่เรื่องแปลกที่ Java จะมี Library ให้เลือกใช้มากมาย โดยเฉพาะอย่างยิ่งการเขียนโปรแกรมเชิงธุรกิจ แต่ Library ส่วนใหญ่ของ Java ได้รับการออกแบบมาซับซ้อนเกินไป ทำให้ใช้ยาก อีกทั้งยังขาด Library สำหรับโปรแกรมทางวิทยาศาสตร์อีกจำนวนมาก
  • Python : imageimageimageimage : แม้ว่า Library ของ Python คลอบคลุมการใช้งานมากกว่า Java (ทางวิทยาศาสตร์, Image Processing, Latex, 3D-Rendering, etc.) แต่ Library ส่วนใหญ่ยังมีมาตรฐานไม่เทียบเท่าของ Java ส่วนหนึ่งเนื่องมาจากเป็นโครงการ OpenSource ขนาดเล็ก
  • Ruby : imageimageimage : ความเป็นภาษาใหม่ของ Ruby ทำให้ Ruby มี Library ให้เลือกใช้ยังไม่มากนัก แต่ Library ของ Ruby ก็น่าจับตามอง เนื่องเพราะเป็น Library ที่ใช้งานง่าย และมีมาตรฐาน เมื่อเปรียบเทียบกับ Java และ Python

Round 4 : Time to code

  • Java : imageimage : ใครบอกว่า Java เขียนง่ายผมคนหนึ่งล่ะที่ไม่เชื่อ คนส่วนใหญ่บอกว่า Java เขียนง่ายกว่า C++ ผมเห็นด้วยเพียงครึ่งเดียว Concept ของ Java แม้จะทำให้เขียนโปรแกรมง่ายกว่า C++ ก็จริง แต่ก็เข้าใจยากกว่าเหมือนกัน (แค่ Itration อ. ที่สอนต้องใช้เวลาอธิบายอยู่หลายอาทิตย์ กว่าพวกผมจะเข้าใจ) และเนื่องจาก Java ยังเป็น Compiled Language อยู่ การลองโน่นลองนี่จึงไม่ใช่เรื่องง่าย เพราะต้องเสียเวลาในการ Compile อีกทั้งความพยายามออกแบบ Java ให้ Common มากที่สุด ก็ทำให้ Java ซับซ้อนเกินกว่าเหตุ
  • Python : imageimageimageimageimage : ความเป็น Script ของ Python ทำให้การเขียนโค้ดด้วย Python รวดเร็วทันใจอยู่แล้ว บวกกับคอนเซพท์ที่เข้าใจง่ายของ Python ยิ่งทำการเขียนโค้ดของ Python เร็วขึ้นไปอีก เครื่องมือในการหาข้อผิดพลาดที่พร้อม คุณภาพโค้ดที่ได้ก็สูง เพราะโดนบังคับโดยตัวภาษา โครงสร้างของภาษาที่รองรับโครงการขนาดใหญ่ โดยส่วนตัวผมเห็นว่า Python น่าจะเป็นภาษาที่เขียนโค้ดได้เร็วที่สุดในขณะนี้
  • Ruby : imageimageimageimage : คุณสมบัติดี ๆ หลายอย่างของ Perl และ Python ถูกสอดแทรกลงใน Ruby ได้อย่างลงตัว แม้ว่า Ruby จะเป็นภาษาที่ใช้เครื่องหมายมากเกินไป (ออกแนว Perl) ทำให้โค้ดที่ได้อ่านยากไปบ้าง แต่ก็ถูกทดแทนด้วยคอนเซพท์หลายอย่างที่ไม่เหมือนใคร (symbol, attr_reader) ในขั้นต้นการเขียนโค้ดด้วย Ruby อาจเร็วกว่า Python แต่ในระยะยาว Ruby อาจประสบปัญหาเดียวกับ Perl คือ Write only coding

Round 5 : How does the language do ?

5.1 : Block

  • Java : imageimageimageimageimage : สำหรับผมแล้วการแบ่งบล็อกด้วยวงเล็บปีกกา {} เป็นการแบ่งบล็อกที่ผมชอบมากที่สุด เพราะสามารถทำได้ง่าย รวดเร็ว และชัดเจน แม้ว่าจะมีปัญหาเกิดขึ้นบ้าง เวลาที่มีบล็อกซ้อนบล็อกมากเกินไป แต่ปัญหานี้ไม่ว่าจะใช้วิธีการแบ่งบล็อกแบบไหน ก็เกิดขึ้นได้ทั้งนั้น การเลี่ยงการเขียนบล็อกซ้อนบล็อกจึงน่าจะเป็นทางออกที่ดีกว่า
  • Python : imageimageimageimage : แม้ว่าการแบ่งบล็อกด้วย indentation มีข้อดีหลายอย่าง ทั้งง่าย รวดเร็ว เป็นการบังคับให้คนเขียนโปรแกรมเขียนโค้ดที่อ่านง่าย แต่ก็มีอันตรายแอบแฝงหลายอย่าง เช่น การใช้ Tabalator ผสมกับการเว้นวรรค ขนาด indentation ที่ไม่เท่ากัน การเขียนโปรแกรมด้วย Python จึงต้องใช้ Editor ที่มีคุณภาพพอสมควร เพื่อป้องกันปัญหาดังกล่าว อีกทั้งต้องมีการตกลงกันระหว่าคนเขียนโปรแกรมว่าจะใช้ indentation แบบใด
  • Ruby : imageimageimage : การแบ่งบล็อกด้วย begin และ end แม้ว่าจะทำให้อ่านง่ายขึ้น แต่ก็ง่ายกว่าการใช้วงเล็บปีกกาไม่มากนัก Ruby เองก็ไม่ใช่ภาษาที่อ่านง่ายอยู่แล้ว การใช้ begin และ end จึงไม่มีข้อได้เปรียบที่ชัดเจน นอกจากจะทำให้โค้ดยาวขึ้น

5.2 : Loop

  • Java : imageimageimage : การวนลูปของ Java เริ่มต้นเดิมทีได้นำวิธีการของ C มาใช้ จากนั้นก็เพิ่ม Iteration เข้ามา แม้ว่า Iteration จะได้เปรียบ for ธรรมดาอยู่หลายอย่าง แต่ก็ทำให้โค้ดที่ได้อ่านยาก ต้องเขียนโค้ดยาว งง ๆ คนส่วนมากจึงยังคงใช้ for ธรรมดามากกว่า Iteration ใน Java 5 จึงได้มี for-each เพิ่มเข้ามา แต่ก็ยัง for-each ที่ยัง งง ๆ อยู่ ถึงตอนนี้ผมยังคอมไพล์โปรแกรมที่มี for-each ไม่ผ่านเลยครับ
  • Python : imageimageimageimageimage : คอนเซพท์ for-loop ของ Python ถือว่าเป็นคอนเซพท์ที่ดีมาก มีการนำ iteration มาใช้โดยที่คนเขียนไม่ต้องทำความเข้าใจเรื่อง iteration แต่อย่างใด for-each เป็นการวนลูปที่เร็วที่สุดใน Python (เร็วกว่า while) มีฟังก์ชั่น zip() ให้ใช้ ทำให้สามารถใช้ for-each กับข้อมูลสองชุดที่มีขนาดเท่ากันพร้อมกันได้
  • Ruby : imageimageimageimage : คอนเซพท์วนลูปของ Ruby คล้ายคลึงกับของ Python มาก ข้อเสียเดียวที่ผมมองเห็นในการวนลูปของ Ruby คือ incosistence Ruby มีการวนลูปหลายรูปแบบเกินไป ทำให้เกิดความสับสนในการใช้งานในบางครั้ง

5.3 : Container

  • Java : imageimage : ตอนผมเรียน Java อ.ที่สอนท่านชอบบอกว่า Collection-Classes ของ Java มันเจ๋งอย่างไรบ้าง หากเปรียบมวยกับ Array ของ C++ มันก็เจ๋งกว่าจริง ๆ นั่นแหละ แต่มันซับซ้อนมาก ๆ มากเกินไป การทำความเข้าใจ Collection-Classes ของ Java ให้แตกฉาน เป็นศาสตร์ และศิลป์ในตัว ต้องใช้เวลานาน มีจำนวน Classes ให้เลือกใช้มากเกินไป ทั้งที่แต่ละ Class ก็ไม่ต่างกันมาก การนำข้อมูลดิบใส่ลงไปใน Container ก็ไม่ใช่เรื่องง่าย ๆ (ดูตัวออย่างโปรแกรม)
  • Python : imageimageimageimageimage : ใน Python มี Container เพียงสามแบบ คือ [List], {Dictionary} และ (Tuple) สามารถนำไปใช้งานง่าย คลอบคลุมทุกการใช้งาน เจ๋งไหม
  • Ruby : imageimageimageimage : คอยเซพท์ Container ของ Ruby เหมือนของ Python ทุกอย่าง แต่ไม่มี Tuple ให้ใช้

Round 6 : OOP

  • Java : imageimageimageimageimage : Java เป็นภาษาเขียนโปรแกรมที่นำทฤษฎี OOP มาใช้งานได้เต็มรูปแบบ และสมบูรณ์ที่สุด มีเพียง C# เท่านั้น ที่สามารถเทียบชั้นกับ Java ได้ในเรื่องนี้ แต่คำถามคือ เรามีความจำเป็นเพียงใด ในการใช้ OOP เต็มรูปแบบ
  • Python : imageimage : แม้ว่า Python จะรองรับการเขียนโปรแกรมแบบ OOP แต่ผมก็มองว่าเป็น OOP แบบขำ ๆ มีคอนเซพท์ OOP หลายอย่างที่ขาดใน Python (public, private, protected, interface, abstact calss, etc.) อีกทั้งทุกอย่างใน Python ไม่จำเป็ต้องเป็น Object สำหรับคนที่เรียน วิชา Software Engineering หรือ Software Architect มา อาจเริ่มต้นกับ Python ไปไม่ถูกเหมือนกัน แต่สิ่งเหล่านี้ถูกทดแทนได้โดย Meta- , Functional-Programming และ Dynamic Typing
  • Ruby : imageimageimageimageimage : Ruby อาจไม่รองรับ OOP เท่า Java แต่ดีกว่า Python และทำหน้าที่ OOP ได้อย่างไม่ขาดตกบกพร่อง OOP ในส่วนที่ขาดไปของ Ruby สามารถทดแทนได้ด้วย Dynamic Typing

Round 7 : Web-Development

  • Java : imageimageimage : แม้ว่า Java จะสร้างชื่อเสียงของตัวเองด้วยการใช้งานบนอินเตอร์เนต แต่ Framework เกี่ยวกับ Web-Development ของ Java ก็ไม่เคยประสบความสำเร็จอย่างจริงจัง Applet โดนโลกลืมอย่างน่าสงสาร Servlet และ JSP ก็โดน PHP กินส่วนแบ่ง ทิ้งห่างอย่างไม่เห็นฝุ่น เพราะมันดันใช้ยาก และตะกละตะกลาม แม้ว่าจะมี Web-Framework ใหม่ ๆ ออกมาให้ใช้งานมากมาย แต่ก็กินส่วนแบ่งกันเอง และไม่มีนวัตกรรมใหม่ ๆ ที่น่าสนใจ
  • Python : imageimageimageimage : Plone ถือเป็น Killer Application ของ Python และเป็นเครื่องยืนยันได้ถึงคุณภาพด้านนี้ของ Python ได้อย่างดี อีกทั้ง Google และ YouTube ต่างก็หันมาใช้ Python อย่างออกหน้าออกตา สำหรับ Framework ก็มีทั้ง Zope , Django และ Turbo-Gear ให้เลือกใช้ แต่ปัญหามันอยู่ตรงนี้แหละครับ มันมีให้เลือกใช้เยอะเกินไปจน inconsistence
  • Ruby : imageimageimageimageimage : บอกได้คำเดียวครับว่า Rails มันสุดยอด

Round 8 : GUI

  • Java : imageimage : เป็นจุดอ่อนของที่ติดตัว Java มานานนับปี AWT , SWT และ Swing ต่างก็มีจุดอ่อนจุดแข็งของตัวเอง แต่เมื่อเปรียบเทียบทั้งสามกับ GUI ภาษาอื่น บอกได้เลยครับว่ามันห่วย สาเหตุก็เนื่องมาจาก Java มันเป็น Manage Code จึงไม่สามารถดึงพลังของ CPU มาใช้สำหรับ GUI ได้เท่า Native Code
  • Python : imageimageimageimageimage : Python เป็นภาษาเขียนโปรแกรมที่มี GUI ให้เลือกใช้มากที่สุดภาษาหนึ่ง ไม่ว่าจะเป็น Tk, Qt, KDE, GTK, Gnome, wxPython และทุก GUI-Toolkit ต่างก็เป็น GUI-Toolkit ที่มีประสิทธิภาพทั้งสิ้น
  • Ruby : imageimageimageimage : ความเป็นภาษาใหม่ของ Ruby ทำให้ Ruby ยังมี GUI ให้ใช้ไม่มากนัก แต่ไม่นานครับ ตอนนี้นักพัฒนาโปรแกรมของ Ruby ต่างเร่งผลิต Toolkit เหล่านี้ให้เราใช้งานอยู่ อีกสองสามปี ผมคิดว่า GUI ของ Ruby คงเทียบชั้น Python ได้ไม่ยาก

Round 9 : ETC.

9.1 : Tools

  • Java : imageimageimageimageimage : เนื่องจาก Java เป็นภาษาที่เขียนยาก แต่มีคนใช้เยอะ เลยมี IDE ดี ๆ ให้เลือกใช้งานหลากหลายตามไปด้วย สองผู้นำในวงการ IDE ของ Java ได้แก่ NetBeans และ Eclipse ซึ่งทั้งสองเป็น IDE ที่มีคุณภาพสูง แถมทั้งคู่เป็น OpenSource อีกต่างหาก นอกจาก IDE แล้ว Java ยังมีเครื่องมืออื่น ๆ ให้เลือกใช้อย่างจุใจ
  • Python : imageimageimage : IDLE เป็นเครื่องมือมาตรฐานที่ติดตัวมากับ Python อันประกอบด้วย Editor และ Interactive-Python ซึ่งเป็นเครื่องมือที่เหมาะสำหรับงานขั้นพื้นฐานเท่านั้น แม้ว่า Python จะเป็นภาษาที่ค่อนข้างได้รับความนิยม แต่ถือว่ามีเครื่องมือจำพวก IDE ให้เลือกใช้งานน้อยมาก
  • Ruby : imageimage : ความเป็นน้องใหม่ของ Ruby ทำให้ Ruby เสียเปรียบในหลาย ๆ ด้าน ไม่เว้นแม้แต่ด้านเครื่องมือการพัฒนาโปรแกรม โดยส่วนตัวผมคิดว่า ในอนาคตเราก็อาจไม่มีเครื่องมืออลังการอย่าง NetBeans หรือ Eclipse สำหรับ Ruby หรือ Python มาใช้งานกัน เพราะคุณสมบัติของภาษา Script ทำให้เครื่องมือต่าง เป็นเพียงเครื่องอำนวยความสดวก มากกว่าเครื่องมือจำเป็น

9.2 : Platform

  • Java : imageimageimageimageimage : คอนเซพท์ Write once run any where ของ Java นั้น ถือเป็นนวรรตกรรมบรรลือโลก ที่ถึงตอนนี้ยังไม่มีใครมาเทียบรัศมี (.NET ฟังดูดี แต่ในความเป็นจริงมันงี่เง่า เพราะใช้งานได้เฉพาะ OS ความหวังจึงน่าจะอยู่ที่ Mono) Byte-Code ที่ได้ไม่ต้องเปลี่ยนแปลงใด ๆ ก็ใช้งานได้ทุก OS ดังนั้นเรื่อง Plattform ต้องยกให้ Java เขาไป
  • Python : imageimageimageimage : แม้ว่า Python จะรองรับหลาย OS ไม่แพ้ Java แต่โค้ดบางส่วน ก็ต้องมีการแก้ไขเพื่อให้เข้ากับ OS โดยเฉพาะในส่วนที่ใช้ Module os ของ Python อีกทั้งการนำไปใช้งาน ก็เป็นการนำซอร์สโค้ดไปใช้ ไม่ได้เป็น Byte-Code อย่าง Java
  • Ruby : imageimageimageimage : เหมือน Python ครับ :P

Round 10 : Performance

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

Platform

Computer-Modell : Notebook Samsung R55
CPU : Intel Core 2 Duo Centrino T5500
CPU-Freq : 1830 MHz
RAM : 1 GB
OS : Ubuntu 6.04 LTS

Java-1.4 : gij (GNU libgcj) version 4.1.0 (Ubuntu 4.1.0-1ubuntu8)
Java-1.6 : Java(TM) SE Runtime Environment (build 1.6.0-b105)
Python : Python 2.4.3 (#2, Oct 6 2006, 07:52:30) , [GCC 4.0.3 (Ubuntu 4.0.3-1ubuntu5)] on linux2
Ruby : ruby 1.8.4 (2005-12-24) [i486-linux]

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

Speed

image

Test Java 1.4 Java 1.6 Python Ruby
Console 12.2 13.9 11.7 12.8
Hash 7.4 2.0 3.6 11.3
IO 1.2 0.7 1.9 6.5
List 2.2 0.4 0.4 5.5
Math 0.7 0.5 0.3 4.4
Real-World-Application 14.8 3.6 0.9 1.5

Memory-usage

image

Test Java 1.4 Java 1.6 Python Ruby
Console 17.9 8.9 17.5 1.6
Hash 17.7 8.9 2.4 40.7
IO 17.9 8.9 2.3 1.6
List 17.9 8.9 2.3 4.1
Math 24.7 22.3 13.9 19.1
Real-World-Application 45.3 37.2 6.2 16.7

Console

ในส่วนนี้ไม่มีใครได้เปรียบเสียเปรียบอย่างได้ชัดในเรื่องความเร็ว แต่การใช้ Memory ต้องยกใช้ Ruby ส่วน Python มีการใช้ Memory มากผิดปกติ สาเหตุน่าจะมาจาก range() ที่ต้องผลิต list ขนาดยักษ์

Java

  1. public class test {
  2. public static void main(String[] args) {
  3. for (int i = 0; i < 1000000; i++) {
  4. System.out.println(i);
  5. }
  6. }
  7. }
  8.  

Python

  1. for x in range(1000000):
  2. print x
  3.  

Ruby

  1. 1000000.times do |i|
  2. puts i
  3. end
  4.  

Hash

Ruby ทำได้ไม่ดีนัก ทั้งในเรื่องความเร็ว และการใช้ Memory ในทางกลับกัน Python กลับทำได้ดีจนน่าแปลกใจ มีการใช้ Memory ขั้นต่ำสุด ความเร็วห่างจาก Java 1.6 ไม่มากนัก

Java

  1. import java.util.*;
  2.  
  3. public class test {
  4. public static void main(String[] args) {
  5. for (int i = 0; i < 6000; i++) {
  6. Map x = new HashMap();
  7. for (int j = 0; j < 1000; j++) {
  8. Integer I=new Integer(i);
  9. Integer J=new Integer(j);
  10. x.put(J,I);
  11. x.get(J);
  12. }
  13. }
  14. }
  15. }
  16.  

Python

  1. for i in range(6000):
  2. x={}
  3. for j in range(1000):
  4. x[j]=i
  5. x[j]
  6.  

Ruby

  1. 6000.times do |i|
  2. x={}
  3. 1000.times do |j|
  4. x[j] = i
  5. x[j]
  6. end
  7. end
  8.  

IO

ในเรื่องความเร็ว ไม่มีอะไรน่าแปลกใจ แต่การใช้ Memory ของทุกภาษาอยู่ในขั้นต่ำสุด

Java

  1. import java.io.*;
  2.  
  3. public class test
  4. {
  5. public static void main(String[] args) {
  6. try {
  7. File f = new File("/tmp/scratch");
  8. new FileWriter(f)));
  9. for (int i = 0; i < 1000000; i++) {
  10. pw.print(i);
  11. }
  12. pw.close();
  13. }
  14. catch(IOException ioe) {
  15. ioe.printStackTrace();
  16. }
  17. }
  18. }
  19.  

Python

  1. f=open('/tmp/scratch','wb')
  2. for i in xrange(1000000):
  3. f.write(str(i))
  4. f.close()
  5.  

Ruby

  1. f = File.new("/tmp/scratch", "w")
  2. 1000000.times do |i|
  3. f.syswrite(i.to_s)
  4. end
  5. f.close
  6.  

List

งานนี้มีการใช้ทริกเล็กน้อยสำหรับ Python ทำให้ Python มีความเร็วเทียบเท่า Java-1.6 ขึ้นมาได้ ส่วน Ruby รั้งท้ายเหมือนเดิม

Java

  1. import java.util.*;
  2.  
  3. public class test {
  4. public static void main(String[] args) {
  5. List initial = new ArrayList();
  6. initial.add("a");
  7. initial.add("b");
  8. initial.add("c");
  9. initial.add("d");
  10. initial.add("e");
  11. initial.add("f");
  12. initial.add("g");
  13.  
  14. for (int i = 0; i < 3000; i++) {
  15. List v = new ArrayList(initial);
  16. for (int j = 0; j < 1000; j++) {
  17. v.add(new Integer(j));
  18. v.get(j);
  19. }
  20. }
  21. }
  22. }
  23.  

Python

  1. a = map(lambda x : ['a','b','c','d','e','f','g']+range(1000),range(3000))
  2. for i in a : i
  3.  

Ruby

  1. 3000.times do |i|
  2. v=['a','b','c','d','e','f','g']
  3. 1000.times do |j|
  4. v.push(j)
  5. v[j]
  6. end
  7. end
  8.  

Math

การทดสอบในส่วนนี้ค่อนข้างใกล้เคียงการใช้งานจริงที่ผมใช้อยู่ ที่ตลกคือ การจัดการ Memory และระบบ Typecast ของ Java ตอนแรกผมใช้ Class ArrayList ในการเก็บข้อมูล แต่ก็ต้องมานั่งปวดหัวกับเรื่อง Typecast มากกว่าจะมาจดจ่อกับตัวโปรแกรม เลยต้องหันใช้ double[] แทน แต่ตัว double[] ก็เก็บข้อมูลได้เพียง 2000000 หน่วย และไม่สามารถประกาศตัวแปรขนาด 2000000 หน่วย ติดต่อกันได้เกิน 3 ตัวแปร ไม่งั้นมีเรื่อง ส่วน Ruby ก็ช้าจนน่าเกลียด

Java

  1. import java.lang.Math;
  2.  
  3. public class test {
  4. public static void main(String[] args) {
  5. double[] x = new double[200000];
  6. double[] gauss = new double[200000];
  7. double[] laplace = new double[200000];
  8. double[] si = new double[200000];
  9. double[] sisqr = new double[200000];
  10. double[] bp = new double[200000];
  11. for(int i = 0 ; i < 200000; i++){
  12. x[i] = (i/10000.0)-10.0;
  13. gauss[i] = Math.exp(-1.0 * x[i] * x[i]);
  14. laplace[i] = Math.exp(-1.0 * Math.abs(x[i]));
  15. si[i] = Math.sin(x[i]*Math.PI)/(x[i]*Math.PI);
  16. sisqr[i] = si[i]*si[i];
  17. bp[i] = si[i]*Math.cos(x[i]*100);
  18. }
  19. }
  20. }
  21.  

Python

  1. import numpy
  2. x = numpy.arange(-10,10,0.0001)
  3. gauss = numpy.exp(-(x**2))
  4. laplace = numpy.exp(-numpy.abs(x))
  5. si = numpy.sin(x*numpy.pi)/(numpy.pi)
  6. sisqr = si**2
  7. bp = si*numpy.cos(x*100)
  8.  

Ruby

  1. x = []
  2. gauss = []
  3. laplace = []
  4. si = []
  5. sisqr = []
  6. bp = []
  7. 200000.times do |i|
  8. x.push( (i / 10000.0)-10.0 )
  9. gauss.push( Math.exp(-1.0 * x[i] * x[i]) )
  10. laplace.push(Math.exp(-1.0 * x[i].abs ))
  11. si.push(Math.sin(x[i]* Math::PI) / (x[i] * Math::PI))
  12. sisqr.push(si[i]*si[i])
  13. bp.push(si[i]*Math.cos(x[i]*100))
  14. end
  15.  

Real-World-Application

การทดสอบสุดท้าย ผมคิดว่าน่าจะใกล้เคียงกับการใช้งานจริงมากที่สุด ในการทดสอบนี้ตัวโปรแกรมต้องสร้าง Query เพื่อสอบถามไปยังฐานข้อมูลก่อน เมื่อได้ข้อมูลมาแล้ว จึงเปลี่ยนแปลงรูปแบบข้อมูลด้วย RegEx และ Splitจากนั้นข้อมูลจะถูกเก็บไว้ใน Hash สุดท้ายก็แสดงผลข้อมูลออกมาทาง Console จะเห็นได้ว่า การทดสอบนี้ มีส่วนประกอบที่ใช้ในการเขียนโปรแกรมเวบไซท์ค่อนข้างครบ

ข้อมูลที่อยู่ในฐานข้อมูลก็คือข้อมูลของ BioLawCom.De คำที่ผมใช้หาในฐานข้อมูลคือ ตัวอักษร a ข้อมูลที่ได้มีทั้งสิ้น 690 rows

สิ่งที่น่าเบื่อมากใน Java คือ Typecast และไม่สามารถบรรจุข้อมูลลงใน Hash และ List ได้แบบง่าย ๆ อย่าง Python กว่าผมจะเขียนโปรแกรมนี้ด้วย Java ได้ต้องใช้เวลานานมาก เพราะต้องแก้ไขข้อผิดพลาดเกือบทุกครั้งที่คอมไพล์ ส่วน Ruby และ Python นั้นมีความคล้ายคลึงกันมาก ต่างกันเพียงแค่รายละเอียดเล็กน้อยเท่านั้น

โปรแกรมที่ได้จาก Ruby และ Python มีขนาดใกล้เคียงกันมาก แต่ของ Java มีขนาดใหญ่กว่าเกือบสองเท่า เวลาที่ใช้ในการเขียนอาจจะมากกว่าห้าหรือสิบเท่า ผลที่ออกมาก็ไม่คุ้มกับเวลาที่เสียไปเอาเสียเลย Java ทั้งใช้เวลามากกว่า และใช้ Memory มากกว่า น่าผิดหวังมาก ส่วน Python นั้นนำโด่ง ทิ้งห่าง Ruby เกือบสองเท่า

(เนื่องจากโค้ดยาวมาก ดังนั้น ผมเลยแยกโค้ดออกมาต่างหาก สามารถดาวน์โหลดได้ที่ Real.zip ครับ)

  • Java : imageimageimage : มีความเร็วเหนือกว่า Ruby และ Python ในเรื่องง่าย ๆ และพื้น ๆ เท่านั้น โปรแกรมที่มีความซับซ้อนมากขึ้น Java จะเริ่มตะกละ และอุ้ยอ้าย การจะเขียน Application ขนาดใหญ่ด้วย Java จึงต้องเตรียมรับเรื่องนี้ไว้ให้ดี
  • Python : imageimageimageimageimage : ต้องยกให้เป็นผู้ชนะในครั้งนี้ครับ เพราะมีความเร็วสูงสุดใน 4 จาก 6 การทดสอบ ในการทดสอบที่ Python ช้ากว่า Java ก็มีความแตกต่างเกิดขึ้นไม่มากนัก
  • Ruby : imageimageimage : แม้ว่า Ruby จะไม่ชนะในการทดสอบใดเลย แต่ก็รักษาตำแหน่งการใช้ Memory น้อยได้โดยตลอด แม้ว่าการทดสอบพื้น ๆ Ruby จะเป็น looser แต่ในการใช้งานจริง โดยเฉพาะ Web-Application Ruby ก็สามารถรักษาความเร็วของตัวเองได้ดีทีเดียว แต่สำหรับโปรแกรมจำพวก Simulation ลืม Ruby ไปได้เลยครับ

Conclusion

ในส่วนของผลรวมคะแนน ผมคิดว่าแต่ละคนคงมีตัวคูณสำหรับคะแนนจากแต่ละยกที่ไม่เท่ากัน สำหรับผม ในเรื่อง Peformance x 3 และ Time to code x 2 และ Python ก็เป็นแชมป์ในครั้งนี้ แต่ทั้งหมดทั้งสิ้นก็เป็นการให้คะแนนโดยผมเพียงคนเดียว ซึ่งอาจไม่ตรงใจหลาย ๆ คน ก็สามารถให้คะแนนแต่ละส่วนกันได้ตามความพอใจครับ

ทั้งนี้และทั้งนั้น ในส่วนของ Performance และ Time to code เป็นส่วนสำคัญมาก และ ผลก็คงเปลี่ยนแปลงจากนี้ไปได้ไม่มาก จากสองส่วนนี้ผมพอจะสรุปได้ว่า Java เป็นอะไรที่ไม่น่าใช้เอาเสียเลย เพราะต้องเสียเวลาเขียนโค้ดนาน แต่โปรแกรมที่ได้กลับไม่มีข้อได้เปรียบใด ๆ

สำหรับบริษัทพัฒนาโปรแกรม หากเลือกใช้ Java เหมือนกับเป็นการเสียเงินลงทุนไป 5-10 เท่าโดยใช่เหตุ ส่วนหนึ่งต้องลงทุนไปกับการเขียนโค้ดที่ต้องใช้เวลานานขึ้น ส่วนหนึ่งต้องเสียไปกับการซื้อเครื่องมือมาช่วยในการพัฒนาโปรแกรม ส่วนหนึ่งต้องเสียไปในการอบรมพนักงาน และอื่น ๆ อีกมากมาย

ข้อได้เปรียบเดียวของ Java คือ เครื่องมือที่พร้อม และมีทฤษฎีรองรับมากมาย ทฤษฎีการวางโครงสร้างระบบส่วนมาก ใช้ Java เป็นภาษาอ้างอิง ในส่วนของทฤษฎีผมมองว่า เราสามารถนำมาปรับใช้กับ Python และ Ruby ได้ไม่ยาก

ส่วน Python นั้นเป็นภาษาที่สามารถนำไปใช้งานได้หลายรูปแบบ ใช้เวลาในการเขียนโค้ดน้อย โปรแกรมที่ได้มี Performance สูง (ว่ากันว่า Python 3000 จะมีความเร็วเพิ่มขึ้นอีก 20-30%) จึงไม่ใช่เรื่องแปลกที่ Python จะเป็นภาษาที่ได้รับความนิยมมากขึ้นเรื่อย ๆ

ข้อเสียเปรียบเดียวของ Ruby คือ เป็นภาษาที่ยังใหม่อยู่ จึงยังอาจไม่พร้อมในหลาย ๆ เรื่อง แต่ Community ของ Ruby ก็โตวันโตคืน ทำให้ Ruby ได้รับการพัฒนาอย่างรวดเร็ว และ อาจเทียบชั้นภาษารุ่นพี่อย่าง Java และ Python ได้ในอนาคตอันใกล้

แม้กระนั้นก็ตาม Web-Application ถือเป็นจุดแข็งที่สำคัญที่สุดของ Ruby คุณภาพของ Ruby on Rails อาจทำให้ Ruby เป็นภาษาที่เข้ามาแทนที่ PHP ในอนาคต แต่เรื่องนี้เราคงด่วนสรุปไม่ได้ เพราะขณะนี้มีโปรแกรมจำนวนมากใช้ PHP การเข้ามาแทนที่ PHP ของ Ruby จึงต้องใช้ระยะเวลา และปัจจัยอื่น ๆ อีกมากมาย

Hiring! บริษัทที่น่าสนใจ

Token X company cover
Token X
Blockchain, ICO, Tokenization, Digital Assets, and Financial Service
Carmen Software company cover
Carmen Software
Hotel Financial Solutions
TechFlow Solution Co., Ltd. company cover
TechFlow Solution Co., Ltd.
TechFlow is a tech company which developing a one stop service platform for construction business.
Next Innovation (Thailand) Co., Ltd. company cover
Next Innovation (Thailand) Co., Ltd.
We are web design with consulting & engineering services driven the future stronger and flexibility.
KKP Dime company cover
KKP Dime
KKP Dime บริษัทในเครือเกียรตินาคินภัทร
Kiatnakin Phatra Financial Group company cover
Kiatnakin Phatra Financial Group
Financial Service
Fastwork Technologies company cover
Fastwork Technologies
Fastwork.co เว็บไซต์ที่รวบรวม ฟรีแลนซ์ มืออาชีพจากหลากหลายสายงานไว้ในที่เดียวกัน
Thoughtworks Thailand company cover
Thoughtworks Thailand
Thoughtworks เป็นบริษัทที่ปรึกษาด้านเทคโนโยลีระดับโลกที่คว้า Great Place to Work 3 ปีซ้อน
Iron Software company cover
Iron Software
Iron Software is an American company providing a suite of .NET libraries by engineer for engineers.
CLEVERSE company cover
CLEVERSE
Cleverse is a Venture Builder. Our team builds several tech companies.
Nipa Cloud company cover
Nipa Cloud
#1 OpenStack cloud provider in Thailand with our own data center and software platform.
Bangmod Enterprise company cover
Bangmod Enterprise
The leader in Cloud Server and Hosting in Thailand.
CIMB THAI Bank company cover
CIMB THAI Bank
MOVING FORWARD WITH YOU - CIMB is the leading ASEAN Bank
Bangkok Bank company cover
Bangkok Bank
Bangkok Bank is one of Southeast Asia's largest regional banks, a market leader in business banking
Gofive company cover
Gofive
“We create world-class software experience”
KBTG - KASIKORN Business-Technology Group company cover
KBTG - KASIKORN Business-Technology Group
KBTG - "The Technology Company for Digital Business Innovation"
Siam Commercial Bank Public Company Limited company cover
Siam Commercial Bank Public Company Limited
"Let's start a brighter career future together"
Icon Framework co.,Ltd. company cover
Icon Framework co.,Ltd.
Global Standard Platform for Real Estate แพลตฟอร์มสำหรับธุรกิจอสังหาริมทรัพย์ครบวงจร มาตรฐานระดับโลก
REFINITIV company cover
REFINITIV
The Financial and Risk business of Thomson Reuters is now Refinitiv
H LAB company cover
H LAB
Re-engineering healthcare systems through intelligent platforms and system design.
LTMH (WM) _TECH company cover
LTMH (WM) _TECH
LTMH (WM) _TECH มุ่งเน้นการพัฒนาผลิตภัณฑ์ที่สามารถช่วยพันธมิตรของเราให้บรรลุเป้าหมาย
Seven Peaks company cover
Seven Peaks
We Drive Digital Transformation
Wisesight (Thailand) Co., Ltd. company cover
Wisesight (Thailand) Co., Ltd.
The Best Choice For Handling Social Media · High Expertise in Social Data · Most Advanced and Secure
MOLOG Tech company cover
MOLOG Tech
We are Modern Logistic Platform, Specialize in WMS, OMS and TMS.
Data Wow Co.,Ltd company cover
Data Wow Co.,Ltd
We enable our clients to realize increased productivity by solving their most complex issues by Data
LINE Company Thailand company cover
LINE Company Thailand
LINE, the world's hottest mobile messaging platform, offers free text and voice messaging + Call
LINE MAN Wongnai company cover
LINE MAN Wongnai
Join our journey to becoming No.1 food platform in Thailand

tr Mon, 09/04/2007 - 16:30

โอ้ ดีๆครับ ได้เห็นความคิดเห็นเพิ่ม :D

sugree Mon, 09/04/2007 - 16:34

โอ้ว ยาวมาก ขอเปลี่ยนจาก range() เป็น xrange() แล้วลองอีกรอบได้มั๊ยครับ

Soul_MasterX Mon, 09/04/2007 - 17:48

"Java : คอนเซพท์ Write once run any where ของ Java นั้น ถือเป็นนวรรตกรรมบรรลือโลก ที่ถึงตอนนี้ยังไม่มีใครมาเทียบรัศมี (.NET ฟังดูดี แต่ในความเป็นจริงมันงี่เง่า เพราะใช้งานได้เฉพาะ OS ความหวังจึงน่าจะอยู่ที่ Mono)"

ก็ .Net เค้าจุดประสงค์คือให้นักพัฒนาภาษาต่างๆ ทำงานได้บน framework ตัวเดียวกันได้คับและแน่นอนว่าต้อง OS เป็น Windows ต่างกับ Java ที่จุดประสงค์คือเขียนภาษาเดียวกันแต่ run ได้บนหลาย Platform ที่เอามาเปรียบเทียบกันผมว่ามันไม่ค่อยถูกต้องเท่าไร...

crucifier Mon, 09/04/2007 - 18:31

In reply to by Soul_MasterX

แต่ผมว่าเปรียบเทียบแบบนี้ถูกต้องแล้วนะ เพราะตัว .NET เอง นอกเหนือจากเขียนได้หลายภาษาแล้ว ก็โปรโมตในเชิงไม่ขึ้นกับแพลทฟอร์มเหมือนกัน

bow_der_kleine Mon, 09/04/2007 - 21:53

In reply to by champ

Python เป็นภาษาที่ได้รับการพิสูจน์มาแล้วครับว่ามี scalability ที่ดี ลองอ่านได้ที่ Python Success Stories

ส่วน Ruby ต้องรอดูไปอีกสักพักครับ แต่ดูจากโครงสร้างแล้ว ผมว่าน่าจะเป็นภาษาที่ scalability สูงอยู่ BioLawCom.De

crucifier Mon, 09/04/2007 - 18:32

ใน PHP หรือโปรแกรมภาษาอื่นๆ เราจะหาข้อมูลเกี่ยวกับเรื่อง Performance ต่างๆ เช่น ความเร็ว หน่วยความจำที่ใช้ ของแต่ละคำสั่งได้อย่างไรครับ เช่น กรณีบทความนี้กล่าวว่า for-each เป็นการวนลูปที่เร็วที่สุดใน Python (เร็วกว่า while) เป็นต้น

** โพสต์ถามไว้ที่ biolawcom.de แล้ว ขออนุญาตโพสต์ซ้ำไว้ที่นี่ด้วยนะครับ

mrkrich Mon, 09/04/2007 - 19:07

Python : imageimageimageimage : คงเหมือนกับภาษา Script ภาษาอื่น ๆ ที่ไม่ต้องรู้อะไรมากก็ลงมือเขียนได้เลย มี Interactive-Console ให้ใช้งาน ลองเล่นไปตามเรื่องตามราว แต่สิ่งที่กวนประสาทมาก ๆ คือ Indent เป็นเรื่องที่ต้องใช้เวลาในการปรับตัวกันนานพอสมควร

ผมไม่ค่อยเห็นด้วยนิดหน่อยที่หักคะแนนจาก Python ตรงเรื่อง Indent ครับ เพราะจากประสบการณ์ที่ต้องแก้ code ต่อจากคนอื่นแล้ว ผมว่าข้อนี้ทำให้ Python ได้เปรียนภาษาอื่นอย่างแรง

เท่าที่เห็นภาษาอื่น ทำให้เกิดความไร้ระเบียบขนาดที่ว่าเจ้าตัวที่เขียนเองยังอ่าน code ตัวเองไม่รู้เรื่องเลย

lew Mon, 09/04/2007 - 19:18

In reply to by mrkrich

ผมเจอเรื่องแก้โค้ดคนอื่นแล้วผมให้คะแนนลบนะครับ ผมชอบใช้ space อีกคนชอบใช้ tab ส่งงานกันแรกๆ นี่งงสุดๆ

จริงแล้วเรื่องใช้ tab ก็ไม่น่าใช่เรื่องใหญ่ แต่ผมว่าน่าจะ define ให้ strict กว่านี้ เช่นฟันธงไปเลยว่าต้องใช้ tab เท่านั้น ------ LewCPE

sugree Mon, 09/04/2007 - 21:18

In reply to by lew

เคยเจอเหมือนกัน ต้องแปลง tab กระจุย จำได้ว่าเคยบอกให้มันใช้ space นี่หว่า ไหงกลายเป็น tab ไปได้

ABZee Tue, 10/04/2007 - 12:11

In reply to by lew

ใน http://www.jwz.org/doc/tabs-vs-spaces.html พูดถึงว่าทำไม /t ถึงไม่ดี และไม่ควรใช้ใน Python

แต่ผมติดการเขียนโปรแกรมโดยใช้ tab มาจาก C ดังนั้นแทนที่ผมต้องเปลี่ยนจากการกด tab มาเป็น space ผมจึงแก้ tab ให้เป็น space x 4 แทน

ใน vim ผมใช้: set expandtab " เมื่อเจอ tab ให้มันแก้เป็น space set softtabstop=4 " เมื่อเจอ 4 space ให้มองว่ามันอาจจะเป็น tab

khajochi Mon, 09/04/2007 - 19:22

รัก Java ไม่ยอมเปลี่ยนแปลง :D

ไม่ค่อยเห็นด้วยที่ community กับ library ที่ให้ java ได้เท่ากับ python ครับ .. ในความเป็นจริงถ้าวัดจำนวนแล้ว java ทิ้งไม่เห็นฝุ่นเลยครับผมว่า

lew Mon, 09/04/2007 - 19:26

In reply to by khajochi

เรื่องนี้ถ้าเป็นผมผมให้คะแนนมากกว่าจาวาอีกนะ เพราะแม้ว่าจาวาจะเยอะกว่า แต่แนวคิด battery included ทำให้ไลบรารีทาง Python มาในรูปแบบ Standard Library ซึ่งเวิร์คกว่ามาก เพราะ doc มันรวมมากับตัว python โดยตรง ------ LewCPE

mk Mon, 09/04/2007 - 19:43

In reply to by khajochi

เรื่อง community ผมเห็นด้วยนะครับว่าจำนวนมีผลแปรผันตรง

แต่ library ผมคิดเหมือนคุณ bow ว่าจำนวนไม่ใช่สิ่งสำคัญ ปัญหาอยู่ที่ว่ามีแล้วมันเวิร์คไหม ต้องติดตั้งเพิ่มเติมวุ่นวายหรือเปล่า ซึ่งตรงนี้ batteries included ชนะขาด

narok119 Mon, 09/04/2007 - 20:37

ผมว่าโครงสร้าง และ syntax ภาษา java นั้น "สวย" ที่สุดในสายตาผมตอนนี้นะ

อาจจะผมชอบภาษา {ปีกกา} เป็นพิเศษ

JavaDevil Mon, 09/04/2007 - 21:08

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

ปล. ใครอยากสอน Python or Ruby แบบแนะแนวทาง ก็บอกนะครับ แหะ ขอเป็นประมาณ IM ก็พอ.

deans4j Mon, 09/04/2007 - 22:41

ผมขออนุญาตโต้ละ​กัน

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

ผม​เป็น​ใคร​? ไม่​ได้​เป็น​ใคร​ ​มนุษย์ขี้​เหม็นธรรมดาคนหนึ่ง​ cert. ​ซักใบ​ไม่​มี​ ​ทำ​งาน​และ​เกี่ยวข้อง​กับ​จาวาตลอด​ 3 ​ปีที่​เรียนจบปริญญาตรี​ ​ตอนนี้ทำ​หัวข้อวิทยานิพนธ์ปริญญา​โทเกี่ยว​กับ​จาวา​โดย​ตรง

About this fight ด้วย​ความ​เคารพคุณ​ bow_der_kliene ​เท่า​ที่คุณออกตัวว่า​ไม่​ถนัดจาวาผมก็พอเห็นภาพ​จาก​โค้ดที่คุณเขียน​อยู่​ ​แล้ว​ก็ขออนุมานว่าคุณคง​ไม่​ถนัด​ OOP ​เท่า​ไหร่​ ​(​ถ้า​ผมผิดก็ขออภัย) ​ผมมองโลก​ใน​แง่ดีว่าคุณคงเขียนโค้ดจาวานี้​จาก​ความ​ไม่​ถนัดของตัวเอง​ ​เพราะ​ว่า​โค้ดนี้​เหมือน​จะ​พยายามเขียน​ให้​จาวาช้า​ให้​ได้​ยัง​ไง​ยัง​งั้น​ : )

ผมขอโต้​เป็น​หัวข้อๆ​ ​ไปละ​กัน

Round 1 : The First Impression

ถูก​แล้ว​ครับจาวา​เหมาะ​กับ​ Software Engineer ​มากกว่าทุกภาษา​ ​ด้วย​เหตุที่มัน​เป็น​ภาษา​ managed code ​และ​เป็น​ภาษา​ static ​จึง​เหมาะสม​กับ​งานที่​ต้องการ​ความ​สามารถ​ด้าน​ scalability, security,maintainability ​เป็น​อย่างยิ่ง​ ​ด้วย​ความ​ที่ภาษาจาวา​ไม่​ใช่​ภาษาประ​เภท​ dynamic ​มัน​จึง​ไม่​เหมาะ​กับ​การทำquick & dirty ​จริงๆ​ ​ผมเห็น​ด้วย​ทุกประการ​ ​แต่จาวา​แพลตฟอร์มก็​ไม่​ต่าง​กับ​ .NET ​ที่​สามารถ​โค้ด​ด้วย​ภาษา​อื่น​ ​ผู้​ใช้​สามารถ​เลือกภาษาที่​เหมาะสม​กับ​จุดประสงค์ของตัวเอง​ ​ตัวอย่างภาษา​อื่น​ที่​สามารถ​ทำ​งานบนจาวา​แพลตฟอร์ม​ได้​แก่​ JavaScript, JRuby, Jython, Groovy ​หรือ​แม้​แต่​ PHP ​เป็น​ต้น​ ​ต่อไป​ในอนาคตอัน​ใกล้​รับรอง​ได้​ว่า​จะ​เห็นภาษา​อื่น​นอก​จาก​จาวาทำ​งาน​อยู่​บนแพลตฟอร์มมากขึ้นอย่างมีนัยสำ​คัญ

Round 2 & Round 3 : Community & Library

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

การโอเพนซอร์สจาวา​ใน​อนาคต​ ​ผมเชื่อเหลือเกินว่า​จะ​ทำ​ให้​ชุมชนนี้​เข้มแข็งขึ้นกว่า​เดิมมาก​ ​ซันเอง​ใส่​ใจ​กับ​จาวามากขึ้น​ใน​ช่วง​ 2-3 ​ปีที่ผ่านมา​ ​ใน​อดีตบ่อยครั้งเหลือเกินที่ซันมักปล่อยสเป็กออกไปแต่ขาดตัว​ reference implementation ​ที่ดีที่​สามารถ​ทำ​งาน​ได้​ตามสเป็กอย่างมีประสิทธิภาพ​ ​ผู้​ใช้​ต้อง​รอ​ให้ฝั่งโอเพนซอร์ส​หรือ​ทางเวนเดอร์​อื่นๆ​ ​มาสร้าง​ ​การเปลี่ยน​ bussiness model ​ของซันส่งผล​ให้​แนวคิด​เช้า​ชามเย็นชามหมดไป​ ​สังเกตุ​ได้​จาก​การหันมา​ใส่​ใจกับ​สิ่งที่ตัวเองมีมากขึ้น​ ​ยกตัวอย่างเช่น​ NetBeans, Glassfish, Solaris ​พักหลังๆ​ ​เรา​จะ​เห็น​ได้​ว่าตัวอย่างที่ยกมา​ได้​รับการยกย่องว่ามีพัฒนาการที่ดีสุด​ ​ไม่ใช่​แค่ผลิตภัณฑ์​แต่รวม​ถึง​เอกสาร​ ​เว็บไซต์​ ​ต่างๆ​ ​ที่พักหลัง​ได้​รับ​ความ​ใส่​ใจ​ทั้ง​ด้านเนื้อหา​และ​ความ​ง่าย​ใน​การ​เข้า​ถึง​ใช้​งานอย่างมาก​ ​แต่ก่อน​ถ้า​ใคร​ไม่​เคยเข้า​ SDN ​นานมา​แล้ว​ ​กลับไปดูตอนนี้​จะ​เห็นเอกสารมากมายที่อ่าน​กัน​ไม่​หวาด​ไม่​ไหว

Round 4 : Time to code

ผมมา​จาก​สาย​ C++ ​ผมยืนยัน​ได้​ว่า​ทั้ง​ไลบรารี​ ​ทั้ง​ตัวภาษาทำ​ให้​เขียนง่ายกว่า​ C++ ​แน่นอน​ ​คนที่มี​โอกาส​ได้​เขียนแอพลิ​เคชันบนมือถือคง​ช่วย​ยืนยันคำพูดผม​ได้​ ​ถ้า​เทียบโค้ด​ Symbian ​กับ​จาวา​จะ​เห็นนรก​กับ​สวรรค์​ ​ส่วน​ถ้า​เทียบ​กับ​ภาษา​ dynamic ​ถ้า​อยากเปรียบมวย​กัน​ ​มัน​จะ​ไม่​ใช่​ประ​เด็น​ Java VS. Python VS. Ruby ​แล้ว​ ​มัน​จะ​กลาย​เป็น​ประ​เด็น​ Static Language VS. Dynamic Langauge ​มากกว่า​ ​ผมว่า​ถ้า​อยากเปรียบมวย​กัน​แบบแฟร์ๆ​ ​น่า​จะ​ไปเทียบ​กับ​ภาษา​ Groovy ​ที่​เกิดมา​เพื่อ​เป็น​ภาษา​ dynamic ​ที่ทำ​งานบนแพลตฟอร์มจาวา​โดย​เฉพาะ​จะ​ตรงตัวกว่า​ ​ผมว่า​เรื่องพวกนี้มัน​เป็น​รสนิยม​ส่วน​ตัวของใครของมันมากกว่า

Round 5 : How does the language do ?

5.1 Block

ผม​ไม่​มีประ​เด็นอะ​ไรเกี่ยวข้อง​กับ​จาวา​ให้​พูด​ถึง

5.2 : Loop

ตั้งแต่​ Java 5.0 ​ก็มีฟี​เจอร์​ for-each ​ให้​ใช้​ ​ผมว่าก็​ไม่​ได้​ใช้​ยากอะ​ไรเลย​ ​น่า​จะ​เป็น​ที่คุณ​ bow_der_kliene ​ขาด​ความ​ถนัดซะมากกว่า​ ​การขาด​ Closure ​ในภาษาอาจ​จะ​ทำ​ให้​ดูขาดลูกเล่นหวือหวา​ไปบ้าง​ ​แต่พบ​กับ​มัน​ได้​แน่นอน​ใน​ Java 7.0 ​หรือ​ถ้า​อดใจ​ไม่​ไหว​ Groovy ​ก็​เป็น​ทางเลือก​อื่น​ให้​ลอง

5.3 Collection

อย่างที่บอกจาวา​เป็น​ภาษา​แห่งทางเลือก​ ​เรา​สามารถ​ที่​จะ​เลือก​ได้​หมดว่าอยาก​ได้​ data structure ​แบบไหน​ ​สามารถ​แจกแจงย่อยลงไปเพื่อ​ให้​เหมาะสม​กับงาน​ ​มีตัวเลือกอย่าง​ Stack, Queue, Tree, Map, List, Set ​ที่ภาย​ใน​ซอยแยกออก​เป็น​รายละ​เอียดมากมาย​ ​โดย​ปกติ​ถ้า​ไม่​ได้​ใช้​อะ​ไรหวือหวาตัวเลือกธรรมดาอย่าง​ ArrayList, LinkedList, HashMap, HashSet ​ก็​เพียงพอต่อการ​ใช้​งาน​ ​นอก​จาก​นี้หาก​ยัง​ไม่​พอใจ​ยัง​มี​โปรเจ็กโอเพนซอร์สของ​ Apache ​ที่รวบรวม​ Collection ​ขั้น​ advance ​มากมาย​ ​หรือ​อีกตัวของ​ Javalution ​ที่นำ​เสนอ​ FastMap , Map ​ความ​เร็ว​สูงเหมาะ​กับ​งานที่​ความ​เร็ว​ HashMap ​ธรรมดาๆ​ ​ไม่เพียงพอ​ ​มัก​ใช้​ใน​งาน​ real-time

​ผม​ไม่​เชื่อหรอกครับว่ามัน​จะ​มี​ silver bullet ​ที่​สามารถ​จัดการ​ได้​ทุกอย่าง​ ​ทุกที่​ ​ทุก​ความ​ต้อง​การ

นอก​จาก​นี้สิ่งที่​เป็น​ที่​เทิดทูนมากที่สุด​ ​คือ​ความ​สามารถ​ทางด้าน​ concurrent programming ​ที่​ java.util.concurrent ​ได้​นำ​เสนอตั้งแต่​ Java 5.0 ​เป็นความ​สามารถ​ที่มี​เอกลักษณ์หา​ได้​ยาก​ใน​แพลตฟอร์ม​อื่น

Round 6 : OOP

OOP ​เต็มรูปแบบเหมาะ​กับ​ระบบที่​ต้อง​การ​ความ​มั่นใจสูง​ ​สิ่งที่ผิดพลาด​ไม่​ได้​ ​จึง​เหมาะ​กับ​การสร้าง​เป็น​ core ​ของ​ business ​หลัก​ ​เหมาะ​กับ​ระบบขนาด​ใหญ่​ ต้อง​การ​ความ​สามารถ​ใน​การบริหารจัดการ​ ​ดู​แลรักษา​ ​เหมาะ​กับ​ระบบที่​ต้อง​ scale ​ได้​สูงๆ​ ​รองรับการขยาย หลักฐานที่สำคัญก็คือองค์กรขนาดใหญ่ เวนเดอร์เจ้าต่างๆ ก็ให้การยอมรับจาวาทั้งนั้น

Round 7 : Web-Development

จุดประสงค์ที่​แท้จริงของ​ Java EE ​อย่างที่ผมบอกไป​ ​จุดขายของมัน​อยู่ที่ระบบข้างหลังที่จาวาชนะต่างหาก​ ​เรา​จะ​เห็นการ​ใช้​จาวา​เฉพาะ​ใน​ระดับเว็บ​ ​หรือองค์กรขนาด​ใหญ่​อย่าง​ ebay.com ​เป็น​ต้น​ ​จาวา​จึง​ไม่​มี​ความ​จำ​เป็น​หากนำ​มา​ใช้​สร้างเว็บ​เล็กๆ​ ​ที่​ PHP CMS ​ก็​เพียงพอ

หากคุณ​ไม่​ใช่​ engineer ​เลย​ไม่​ชอบ​ web framework ​ตัวหลักๆ​ ​ใน​จาวา​เอาซะ​เลย​ ​อย่างที่ผมบอกอีกนั่นแหละว่าจาวา​เป็น​ภาษา​แห่งทางเลือก​ ​ถ้า​คุณชื่นชอบ​ web framework ​อย่าง​ Ruby on Rails ​จาวามีทางเลือกอย่าง​ Groovy on Grails, Sails, Trails ​หรือ​ถ้า​คุณถนัด​ PHP ​ใน​การสร้างเว็บไซต์​ ​มันก็​ไม่จำ​กัดว่า​ PHP ​จะ​คุย​กับ​จาวา​ไม่​ได้​ซะหน่อย​ ​อย่างที่ผมบอก​ ​ผม​ไม่​เชื่อเรื่อง​ silver bullet

Round 8 : GUI

ผม​ไม่​คิดว่า​ Swing ​ห่วยเลยนะครับ​ ​ข้อจำ​กัดของ​ Swing ​มีน้อยมาก​ ​ตั้งแต่​ Java 1.5 update 8 ​ขึ้นไป​ ​ซันปรับปรุงการทำ​งานของ​ Swing ​อย่างมโหฬาร​ ทั้ง​ความ​เร็ว​และ​หน้าตา​ ​แม้​ Metal/Ocean ​จะ​ไม่​สวยเอาซะ​เลย​ ​แต่​ Look & Feel ​ตัว​อื่นๆ​ ​ที่ทำ​งาน​ได้​ข้ามแพลตฟอร์ของ​ 3rd party ​ที่ดีๆ​ ​โอเพนซอร์ส​ ​ก็มีเยอะ​แยะ​ ​เครื่องมือพัฒนา​ GUI ​มืออาชีพอย่าง​ NetBeans Matisse ​ก็​สามารถ​สร้างแอพลิ​เคชัน​ได้​ง่าย​และ​เร็ว​ ​เป็น​ธรรมชาติ​ ​เก่งกว่า​ Visual Studio.NET ​ด้วย​ซ้ำ​ไป

ถ้า​จะ​ให้​พูด​ ​เรื่อง​ Swing ​พูด​ได้​ยาวเลย​ ​เอา​เป็น​ว่าผมเชื่อว่า​ Swing ​ยัง​มีอนาคตที่สดใส​ ​และ​เก่งกว่า​ ​ง่ายกว่า​ GUI toolkit ​เจ้า​อื่นๆ​ ​เป็น​ไหนๆ

Round 9 : ETC.

ผม​ไม่​มีประ​เด็น​ให้​พูด​ถึง

Round 10 : Performance

ผมเห็นโค้ดของคุณ​ ​คุณ​ bow_der_kliene ​แล้ว​ดู​ไม่​น่า​จะ​ถนัดจาวา​ ​หลายจุดที่​เค้า​ไม่​เขียน​กัน​อย่าง​นั้น​ ​เอา​เป็น​ว่าผมเขียน​ให้​ใหม่​เท่า​ที่ผม​สามารถ​ละ​กัน​ คุณ​จะ​เอา​ไปทดสอบ​ใหม่​หรือ​เปล่าก็​เรื่องของคุณละกันครับ

Console คุณ​ bow_der_kliene ​ทดสอบ​ความ​เร็ว​ผ่าน​ console ​ของ​ IDE ​หรือ​ของ​ OS? ​ถ้า​เป็น​ console ​ของจาวา​ IDE ​มันย่อมช้ากว่า​ console ​ของ​ OS ​เป็น​แน่​ เพราะ​ปกติมัน​จะ​มี​ buffer ​ที่​ใหญ่​กว่า​ ​ความ​สามารถ​ที่มากกว่า​ ​ประ​เด็น​อื่น​ผม​ไม่​มี​ ​โค้ดยอมรับ​ได้

Hash

คุณ​ bow_der_kliene ​คง​ใช้​ความ​สามารถ​ของภาษา​ใน​ Java 5.0 ​ไม่​คล่อง​ ​โค้ดข้างล่าง​สามารถ​ทำ​งาน​ได้​กับ​ Java 5.0 ​ขึ้นไป​ ​จุดที่​แตกต่าง​กัน​คือ​ ​เนื่องจาก​จาวา​เป็น​ภาษา​ static ​ดัง​นั้น​ HashMap ​และ​ Collection ​ต่างๆ​ ​สามารถ​ใส่​จำ​นวน​ element ​ที่กำ​กับ​ให้​ VM ​เตรียมพื้นที่​ใน​ memory ​ไว้​ล่วงหน้า​ ​จะ​ได้​ไม่

เสียเวลา​ allocate ​พื้นที่​ใหม่​ ​เพื่อขยายขนาด​ collection ​อย่างที่ผมบอก​ ​ถ้า​จะ​วัดเฉพาะ​ความ​เร็ว​ FastMap ​ใน​ Javalution ​ทำ​งาน​ได้​เร็ว​กว่า​ ​กินหน่วย​ความจำ​น้อยกว่า​ HashMap ​เดิมๆ​ ​เยอะ

import java.util.*;

public class testHash {

public static void main(String[] args) { for (int i = 0; i < 6000; i++) { Map x = new HashMap(6000); for (int j = 0; j < 1000; j++) { x.put(j,i); x.get(j); } } } } IO คุณ​ bow_der_kliene ​เขียน​ส่วน​นี้​เยิ่นเย่อ​ ​และ​ผม​ไม่​เข้า​ใจจุดประสงค์ว่าทำ​ไม​ต้อง​เอา​ PrintWriter ​ไปต่อ

import java.io.*;

public class testIO{ public static void main(String[] args) throws IOException {

Writer writer = new BufferedWriter(new FileWriter("c:/test.txt")); for (int i = 0; i < 1000000; i++) { writer.write(i); } writer.close(); } } List โค้ดคุณ​ bow_der_kliene ​เทียบ​กับ​โค้ด​ Ruby ​แล้ว​มัน​ไม่​ตรง​กัน​ ​น่า​จะ​เป็น​อย่างข้างล่างมากกว่า

import java.util.*; public class testList { public static void main(String[] args) {

for (int i = 0; i < 3000; i++) { List v = new ArrayList(1007);

v.add("a"); v.add("b"); v.add("c"); v.add("d"); v.add("e"); v.add("f"); v.add("g");

for (int j = 0; j < 1000; j++) { v.add(j); v.get(j); } } } } Math คุณ​ bow_der_kliene ​บอกว่ามีปัญหา​เรื่องการ​ cast ​ทำ​ให้​ผมเชื่อว่าคุณขาด​ความ​รู้ด้าน​ Java 5.0 ​พอสมควร​ ​ตัวอย่างข้างล่างผม​ใช้​ความ​สามารถ​ static import ​เพื่อลด​ความ​เยิ่นเย่อของโปรโกรมลง​ ​นอก​จาก​นี้หาก​ไม่​พอใจ​ความ​สามารถ​พื้นฐาน​ใน​ java.util.Math ​ยัง​มี​โอเพนซอร์สมากมายที่​ช่วย​เพิ่ม​ความสามารถ​ตรงนี้​ ​ยกตัวอย่างเช่น​ Apache Commons-Math

ปัญหาเรื่องตัวแปรขนาด 2 ล้านตำแหน่ง คุณ bow_der_kliene ลองกำหนด argument -Xms100m -Xmx100m เข้าไปด้วยตอนรัน เพื่อบ่งบอกว่าต้องการหน่วยต่ำสุดและมากสุดเท่านี้ ที่ต้องให้ผู้ใช้กำกับเองเพราะเหตุผลทางด้านความปลอดภัย ในกรณีที่ผู้ใช้เขียนโปรแกรมไม่ดีแล้วส่งผลให้ memory leak อย่างไม่ตั้งใจ VM จะได้ปิดโปรแกรมให้เอง การกำกับเป็นการบ่งบอกว่าผู้ใช้รู้ตัวว่าตัวเองกำลังทำอะไร จากการทดสอบด้านหน่วยความจำจะเห็นได้ว่า จาวาจองพื้นที่ส่วนหนึ่งไว้เบื้องต้น ถ้าหน่วยความจำเริ่มเกิน VM จะขยาย Heap ขึ้นไปเรื่อยๆ จนถึงค่าสูงสุดที่กำหนดไว้ ถ้าเกินกว่านั้นจะยกเลิกการทำงานของโปรแกรม

import static java.lang.Math.*;

public class testMath { public static void main(String[] args) {

double[] x = new double[200000]; double[] gauss = new double[200000]; double[] laplace = new double[200000]; double[] si = new double[200000]; double[] sisqr = new double[200000]; double[] bp = new double[200000]; for(int i = 0 ; i < 200000; i++)​{ x[i] = (i/10000.0)-10.0; gauss[i] = exp(-1.0 * x[i] * x[i]); laplace[i] = exp(-1.0 * abs(x[i])); si[i] = sin(x[i]*PI)/(x[i]*PI); sisqr[i] = si[i]*si[i]; bp[i] = si[i]*cos(x[i]*100); } } } Real-World-Application ตั้งชื่อซะ​เท่​เลยครับ​ ​ผมเปิดดูนึกว่า​จะ​ใหญ่​กว่านี้ซะอีก​ : ) ​เท่า​ที่ดู​เขียน​ได้​แบบมือสมัครเล่นไปนิดนึงครับ​ ​ต้อง​ขออภัยที่พูดตรงๆ​ ​เครื่องที่ผมเขียนบท​ความ​นี้​อยู่​ ​ขาดเครื่องมือด้านฐานข้อมูล​ MySQL ​ผม​จึง​ยัง​ไม่​ได้​ทดสอบ​ ​เอา​เป็น​ว่า​เดี๋ยวผมทดสอบ​แล้ว​เอามา​โพสละ​กัน​ ​ติด​ไว้​ก่อน​ ​พอดีผมติดธุระสำ​คัญที่​ต้อง​จัดการเลย​ต้อง​ขอตัวก่อน

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

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

ปล. ผมทำ code highlight ไม่เป็น

Gmz Mon, 09/04/2007 - 23:04

In reply to by deans4j

Round 8 : GUI

ผม​​​ไม่​​​คิดว่า​​ Swing ​​ห่วยเลยนะครับ​​ ​​ข้อจำ​​​กัดของ​​ Swing ​​มีน้อยมาก​​ ​​ตั้งแต่​​ Java 1.5 update 8 ​​ขึ้นไป​​ ​​ซันปรับปรุงการทำ​​​งานของ​​ Swing ​​อย่างมโหฬาร​​ ​ทั้ง​​​ความ​​​เร็ว​​​และ​​​หน้าตา​​ ​​แม้​​ Metal/Ocean ​​จะ​​​ไม่​​​สวยเอาซะ​​​เลย​​ ​​แต่​​ Look & Feel ​​ตัว​​​อื่นๆ​​ ​​ที่ทำ​​​งาน​​​ได้​​​ข้ามแพลตฟอร์ของ​​ 3rd party ​​ที่ดีๆ​​ ​​โอเพนซอร์ส​​ ​​ก็มี​เยอะ​​​แยะ​​ ​​เครื่องมือพัฒนา​​ GUI ​​มืออาชีพอย่าง​​ NetBeans Matisse ​​ก็​​​สามารถ​​​สร้างแอพลิ​​​เคชัน​​​ได้​​​ง่าย​​​และ​​​เร็ว​​ ​​เป็น​​​ธรรมชาติ​​ ​​เก่งกว่า​​ Visual Studio.NET ​​ด้วย​​​ซ้ำ​​​ไป

ขอเถียงตรงนี้เลย ผมใช้ NetBeans ตอนทำ Swing ในโปรเจ็คจบตอนเรียน ปวส. แล้วตอนนี้มาใช้ .NET ด้วย SharpDevelop พบเลยว่า Swing ห่วย .NET ทำได้รวดเร็วและสวยงามกว่ามาก การทำงานข้าม platform ได้ไม่ใช่เรื่องสำคัญอะไรเลย สิ่งสำคัญคือ "คนที่ใช้โปรแกรมนี้ พอใจหรือเปล่า"

ขนาด SharpDevelop ยังทำงานได้ดีขนาดนี้ ผมก็เชื่อแน่ว่า Visual Studio.NET ไม่ได้แย่กว่า NetBeans

deans4j Mon, 09/04/2007 - 23:19

In reply to by Gmz

ปัจจัยว่าอะไรยาก ง่าย ขึ้นกับหลายอย่างครับ พื้นฐานเราไม่เท่ากัน ผลลัพธ์ก็ออกมาต่างกัน ชอบอะไรก็ใช้เถอะครับ

sugree Tue, 10/04/2007 - 01:49

In reply to by deans4j

ผมขอเป็นคนกลางเอาโค้ดข้างบนมายำแล้วทดสอบใหม่อีกครั้งละกัน

Console

public class console {
    public static void main(String[] args) {
        for(int i=0;i<1000000;i++) {
            System.out.println(i);
        }
    }
}
for i in xrange(1000000):
    print i
1000000.times do |i|
    puts i
end

Hash

import java.util.*;

public class hash {
    public static void main(String[] args) {
        for(int i=0;i<6000;i++) {
            Map x = new HashMap(6000);
            for(int j=0;j<1000;j++) {
                x.put(j,i);
                x.get(j);
            }
        }
    }
}
for i in xrange(6000):
    x = {}
    for j in xrange(1000):
        x[j] = i
        x[j]
6000.times do |i|
    x = {}
    1000.times do |j|
        x[j] = i
        x[j]
    end
end

IO

import java.io.*;

public class io {
    public static void main(String[] args) throws IOException {
        Writer writer = new BufferedWriter(new FileWriter("/tmp/scratch"));
        for(int i=0;i<1000000;i++) {
            writer.write(i);
        }
        writer.close();
    }
}
f = open('/tmp/scratch','wb')
for i in xrange(1000000):
    f.write(str(i))
f.close()
f = File.new("/tmp/scratch","w")
1000000.times do |i|
    f.syswrite(i.to_s)
end
f.close

List

import java.util.*;

public class list {
    public static void main(String[] args) {
        for(int i=0;i<3000;i++) {
            List v = new ArrayList(1007);
            v.add("a");
            v.add("b");
            v.add("c");
            v.add("d");
            v.add("e");
            v.add("f");
            v.add("g");
            for(int j=0;j<1000;j++) {
                v.add(j);
                v.get(j);
            }
        }
    }
}
for i in xrange(3000):
    v = ['a','b','c','d','e','f','g']
    for j in xrange(1000):
        v.append(j)
        v[j]
3000.times do |i|
    v = ['a','b','c','d','e','f','g']
    1000.times do |j|
        v.push(j)
        v[j]
    end
end

Math

import static java.lang.Math.*;

public class mmath {
    public static void main(String[] args) {
        double[] x = new double[200000];
        double[] gauss = new double[200000];
        double[] laplace = new double[200000];
        double[] si = new double[200000];
        double[] sisqr = new double[200000];
        double[] bp = new double[200000];
        for(int i = 0 ; i < 200000; i++) {
            x[i] = (i/10000.0)-40.0;
            gauss[i] = exp(-1.0 * x[i] * x[i]);
            laplace[i] = exp(-1.0 * abs(x[i]));
            si[i] = sin(x[i]*PI)/(x[i]*PI);
            sisqr[i] = si[i]*si[i];
            bp[i] = si[i]*cos(x[i]*100);
        }
    }
}
import math
x = [0]*200000
gauss = [0]*200000
laplace = [0]*200000
si = [0]*200000
sisqr = [0]*200000
bp = [0]*200000
for i in xrange(200000):
    x[i] = i/10000.0-40.0
    gauss[i] = math.exp(-1.0*x[i]*x[i])
    laplace[i] = math.exp(-1.0*math.fabs(x[i]))
    si[i] = math.sin(x[i]*math.pi)/x[i]*math.pi
    sisqr[i] = si[i]*si[i]
    bp[i] = si[i]*math.cos(x[i]*100)
x = []
gauss = []
laplace = []
si = []
sisqr = []
bp = []
200000.times do |i|
    x.push( (i / 10000.0)-40.0 )
    gauss.push( Math.exp(-1.0 * x[i] * x[i]) )
    laplace.push(Math.exp(-1.0 * x[i].abs ))
    si.push(Math.sin(x[i]* Math::PI) / (x[i] * Math::PI))
    sisqr.push(si[i]*si[i])
    bp.push(si[i]*Math.cos(x[i]*100))
end
          java  python   ruby
console   2.69    1.84   2.86
hash      1.27    4.25   8.99
io        0.15    1.90   4.07
list      0.25    1.85   3.57
math      0.25    1.95   3.05
java version "1.5.0_11"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_11-b03)
Java HotSpot(TM) Client VM (build 1.5.0_11-b03, mixed mode, sharing)
Python 2.5.1c1 (release25-maint, Apr  6 2007, 22:02:36) 
[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2
ruby 1.8.5 (2006-08-25) [i486-linux]

คราวนี้จาวาชนะขาดลอย ซึ่งก็เป็นไปตามที่คิด เพราะจาวาได้รับการปรับปรุงให้เข้ากับการใช้งานมากขึ้นแทนที่จะใช้สมมติฐานเดียวกับ Python และ Ruby งั้นผมขอสรุปว่า อย่าเอารถเกียร์อัตโนมัติมาแข่งกับรถเกียร์กระปุก

ปล. ผมไม่ได้ปรับ Ruby รอผู้เชี่ยวชาญมาปรับดีกว่า แล้วเดี๋ยวจะปรับ Python ตามอีกทีนึง
ปล 2. ผมไม่ใช้ numpy เพราะกลัวจะไม่ยุติธรรม ต้องยอมรับความจริงว่า for-loop ของ Python มันกินแรงพอสมควร ถ้าเลี่ยงได้ก็เลี่ยง ไปใช้ iterator จะเร็วกว่านี้ 2 เท่า แต่โจทย์มันไม่เอื้อเท่าไหร่

sugree Tue, 10/04/2007 - 10:36

In reply to by lew

วัดใหม่อีกรอบนึง เครื่องเดิม แต่แก้โค้ด hash.java นิดหน่อย

elapsed

              java     python       ruby
console      2.369      1.129      2.423
hash         1.360      3.696      9.005
io           0.141      1.866      4.243
list         0.239      1.829      3.558
math         0.249      1.957      3.108

maxsize

              java     python       ruby
console    254.492      8.422      3.293
hash       254.492      8.418     13.730
io         248.734      8.422      3.285
list       249.238      8.418      5.738
math       284.723     29.258     56.699

maxrss

              java     python       ruby
console     10.102      5.639      1.680
hash        10.148      5.680     12.133
io           5.465      5.633      1.664
list         5.527      5.637      4.141
math         4.621     26.582     53.918

เพิ่มอีกนิดหน่อย เนื่องจากจาวาได้คอมไพล์เป็น bytecode ล่วงหน้าไปแล้วเลยไม่ต้องเสียเวลาคอมไพล์ใหม่ ผมเลยแก้นิดหน่อย ย้ายคำสั่งพวกนี้ลงไปในโมดูลเพื่อคอมไพล์เป็น pyc/pyo เรื่องขนาดหน่วยความจำคงไม่ต่าง ขอแค่เวลาอย่างเดียวพอ และถือโอกาสทดสอบใหม่อีกรอบด้วย

              java     python       ruby
console      2.481      1.028      2.402
hash         1.417      2.042      8.997
io           0.141      1.716      4.228
list         0.241      1.267      3.549
math         0.248      1.511      3.035

ช่วยได้นิดนึง

ผมลอง run console ของ java เทียบกับ python ดู บนเครื่องผม (ubuntu 6.10 + java 1.5.0_08-b03 + python 2.4.4c1) python ใช้เวลา 1.3 sec (python console.py > t) java ใช้เวลา 6.9 sec (java -cp . console > t)

แปลกดี ทำไมของคุณสุกรี java ใช้เวลานิดเดียว

เดาว่าเป็นประเด็นเรื่อง buffer ก็เลยเพิ่ม

import java.io.BufferedOutputStream;
public class console {
  BufferedOutputStream out = new BufferedOutputStream(System.out);
  for (int i=0; i<1000000; i++) {
    out.write(Integer.toString(i).getBytes());
    out.write('\n');
  }
  out.flush();
}

run แล้วเหลือเวลา 1.13 sec.

deans4j Tue, 10/04/2007 - 02:41

In reply to by sugree

ขอบคุณที่ช่วยทดสอบครับ ถ้าจะทดสอบด้านหน่วยความจำก็ยินดีครับ แต่ช่วยแก้โค้ด Hash บรรทัด "Map x = new HashMap(6000);" จาก 6000 เป็นแค่ 1000 ด้วยครับ พอดีผมคงตาลายไปหน่อย

sugree Tue, 10/04/2007 - 12:09

In reply to by deans4j

import java.util.*;

public class hash {
    public static void main(String[] args) {
        for(int i=0;i<6000;i++) {
            Map x = new HashMap(1000);
            for(int j=0;j<1000;j++) {
                x.put(j,i);
                x.get(j);
            }
        }
    }
}

แก้เป็นแบบนี้นะ เดี๋ยวรันใหม่

ThaiBuddy Wed, 11/04/2007 - 02:12

In reply to by deans4j

​ผมชอบแนวคิดของท่าน deans4j ทั้งตอนต้นและท้าย แลกเปลี่ยนเพื่อวิชาการ แต่ผมไม่เห็นด้วยกับประโยคนี้เท่าไร "น่า​จะ​พิสูจน์​ได้​ใน​ระดับหนึ่งว่าจาวา​ไม่​ได้​ช้า​ไปกว่าภาษาที่ทำ​งาน​ native และ​บางการทดสอบก็​ได้​ผลลัพธ์ดีกว่า​ด้วย​ซ้ำ" เพราะต้องนิยาม native สำหรับแต่ละคนนั้นหมายถึงอะไรหรือปล่าว? :) เพราะส่วนตัวคิดว่าตัวแปลภาษาใดก็ตามที่ไม่ได้แปลเป็น machine code แต่แปลงเป็น intermediate code ไม่มีทางที่จะเร็วกว่า(เพราะต้องทำการแปล bytecode เป็น machine code อีกที) [ในบทความมี interpreter ด้วย ไม่ขอรวมนะครับ] แนวคิดเรื่อง intermediate code มาตั้งแต่ UCSD pascal(UCSD p-System) เพื่อทำให้ code สามารถ portable แล้ว microsoft นำมาใช้ใน VB(เราถึงเห็น VBrunxxx และ VB ทำงานช้า) แต่ port ไม่ได้ .. ฮา ผมชอบเล่น assembly(แต่ตอนนี้เลิกไปแล้ว)สมัยก่อนจะมีหัวข้อที่ programmer ชอบทำกันก็คือ optimize code(แล้วแต่ optimize เพื่ออะไร) ส่วนตัวใช้ delphi เป็นหลัก(ติดมาจาก turbo pascal) และ ใช้ C บางครั้ง (ผมชอบ code ที่เป็น native cpu code แต่หลังๆเริ่มเปลี่ยนความคิดไปเยอะเพราะฮาร์ดแวร์เร็วมาก) ผมเคยบอกใน blognone นี้ว่าโปรแกรมผมจะไม่เขียนโดย java เพราะไม่ชอบเป็นการส่วนตัว(บังเอิญอาจสั้นไป จริงๆคือไม่อยากใช้ intermidiate code โดยไม่จำเป็น และมี code ที่ต้องทำ hook กับ OS .. สรุปคือถ้าอันไหนเป็น intermediate code ก็ยังไม่ชอบอยู่ดี[แต่ต่อไปก็ไม่แน่ เพราะแรงเริ่มสู้เด็กใหม่ๆที่ขยันและเก่งขึ้นเยอะไม่ได้]) เรื่องภาษาคอมฯบางทีก็เหมือนศาสนาฯ จริงๆผมก็มีส่วนชอบ java (และเป็นคนเขียนบทความของ java เป็นคนแรกๆในไทย-วารสาร internet magazine ฉบับที่ 1)และที่ผมถือว่ายังหาคนเทียบยากก็คือ J2EE สรุปบทความไม่ขอวิจารณ์เพราะความรู้ไม่พอ แต่ขอไม่เห็นด้วยเรื่องภาษา native แต่ความเร็วไม่ใช่การโตต่อไปเสมอไป อย่างเช่น ภาษา forth [forth on wiki] ที่สมัยก่อนถือว่าเร็วมาก(เป็นภาษาที่ถูกออกแบบโดยเอาใจคอมฯเป็นหลัก ภาษาอื่นๆมักเอาใจคนเป็นหลัก)แต่ภาษานี้ก็หายไปแล้ว(หรือยังมีใช้อยู่หว่า?) ---------------- http://www.ThaiBuddy.com ฟรี T<->E dictionary แค่ชี้ mouse

deans4j Wed, 11/04/2007 - 05:27

In reply to by ThaiBuddy

คุณ ThaiBuddy อย่าเชื่อผมมาก อยากให้ลองเล่นเอง อย่าให้ประสบการณ์ในอดีตมาปิดกั้นความคิด นานมาแล้วครับ ที่จาวาเป็นภาษา interprete ปัจจุบันจาวาเป็นลูกผสมครับ

น่าจะเคยได้ยิน Just In Time Compiler ภายใน HotSpot มาบ้าง

สิ่งที่มันทำคือมันฉลาดพอที่จะอ่านก้อนโค้ดมาล่วงหน้า compile พร้อมกับ optimize ณ วินาทีสุดท้ายให้เหมาะสมกับสถาปัตยกรรมของเครื่องนั้นๆ มากที่สุด บีบคั้นเอาทุกหยดทุกรายละเอียด เพื่อให้ได้ประสิทธิภาพสูงสุด แล้ว cache เก็บเอาไว้ เป็นเหตุผลที่ว่าทำไมจาวามีโอกาสเร็วกว่า c

การทดสอบของคุณ sugree ไม่ได้บอกอะไรเป็นนัยสำคัญหรอกหรือ?

ปัจจุบัน HotSpot เปิดโอเพนซอร์สล่วงหน้า ถ้าสนใจลองหาอ่านบทความทางด้านนี้ดู จะพบว่า HotSpot ฉลาดสุดๆ

ThaiBuddy Wed, 11/04/2007 - 06:29

In reply to by deans4j

ผมลืมเรื่อง just in time compiler เลย(จริงๆมีมาตั้งแต่ต้น)แต่อย่างไรผมว่า native compiler(ถ้าเขียนcompiler ไม่ห่วยก็น่าจะชนะ) ... ฮิ ฮิ(อาหารแช่แข็งไม่อร่อย)ผมไม่ปิดกั้นความคิดแน่นอนครับ(ถ้าพิสูจน์ได้) .. สรุปจริงๆแล้วไม่มีแรงตามเทคโนโลยีหลายอันมากกว่าครับ(หลักจากวางมือหลัง JAVA ออกมา 2-3 ปี) อย่างไรการ optimize ก็ยังสู้ native ไม่ได้ แต่ถ้าพูดถึงเทคนิค(caching,prefetch,predict ..etc)ก็ต้องยอมละครับ เพราะเรื่องเทคนิคเป็นเรื่องของการ implement(ซึ่งคงเถียงกันไม่สิ้นสุด) อาจเพราะไปนึก J2ME เป็นหลัก(เอ่ยในบทความ) ลืมนึกถึง J2EE :P ถ้า hardware ใกล้เคียง เช่น symbian,J2ME อย่างไรโปรแกรมบน symbian ก็น่าจะเร็วกว่า(native)? แต่แอบกระซิบว่าผมกำลังจะเขียนโปรแกรม dictionary บนมือถือ คงไม่ต้องถามว่าใช้อะไร(J2ME?) .. ใช่ครับ คงไม่ต้องบอกเหตุผล ในเวลานี้ อนาคตค่อยพูดกันอีกที) :) ผลการทดสอบของคุณ sugree ไม่มี native จริงๆนี่ครับ? หรือผมเข้าใจผิดหว่า(ก็ python,ruby มันเกิดมาเป็น interpreter?(ไม่พูดถึง JIT หรือเทคนิคอื่นผสมนะ) หรือเพราะผมไม่ได้ตาม?) หวังว่าคงไม่มีใครเอาผล JAVA ไปเทียบกับ .Net อีกนะ(เพราะไม่ใช่ native ทั้งคู่ แม้ว่าจะทำเป็น native ได้) ถ้าดู hotspot ก็เกิดมาคู่ๆกับ JAVA ถ้าใครเคยเห็น JAVA run บนเครื่อง 80486 หรือ pentium 1(ตอนนั้นมี just in time แล้ว) คงต้องบอกว่ายังรับไม่ได้[ตอนนั้นไม่มีเครื่องมือ library ..etc มากเท่าทุกวันนี้] :) แต่ตอนนี้ hardware มันไปไกลจริงๆ(ต้องหาเครื่องช้าๆมาลอง run ก็ได้ครับ)..เป็นว่าแค่จุดเล็กๆที่ผมยังไม่ชอบพอที่จะเปลี่ยนใจไปใช้(ถึงบอกว่าภาษาคอมฯเหมือนศาสนา ถกเถียงกันไปอาจไม่จบ แต่ถ้ามีใจเป็นกลางเพื่อแลกเปลี่ยนเรียนรู้ ศาสนาไหนก็เรียนรู้กันได้) :) ---------------- http://www.ThaiBuddy.com ฟรี T<->E dictionary แค่ชี้ mouse

deans4j Wed, 11/04/2007 - 09:46

In reply to by ThaiBuddy

ruby, python เป็นภาษา interpret ถูกแล้วครับ ประโยคนั้นผมตั้งใจชี้ให้เห็นความแตกต่างของ HotSpot

Gmz Mon, 09/04/2007 - 22:41

ส่วนผมมองประโยชน์ที่ได้จากภาษาและความถนัดส่วนตัวมากกว่าครับ java มันก็ไม่ใช่ว่าไม่ดีอะไร เพียงแต่คนเขียนต้องเข้าใจเรื่อง Garbage หน่อย แล้วจะควบคุมการใช้ memory ได้ ถ้าพวก GUI นี่ผมว่า .NET ดีกว่าทุกภาษาเลยครับ

ส่วน Library ที่ java ชนะขาด python ก็พวกทำรายงานครับ ตอนผมจะใช้ python ทำ mini-project นึกถึงเครื่องมือทำรายงานก็มีแต่ของ Java ล่ะครับ ฟรี ๆ ทั้งนั้น สำหรับงานด้านสารสนเทศ java ยังจำเป็นอยู่เยอะเลย ด้าน web ตอนนี้ GWT ก็ช่วยลดจุดอ่อนเรื่องช้า กินแรมเยอะของ JSF ไปได้ อีกประเด็นคือ Concept ของ Hibernate มันดีนะครับ ถ้าศึกษาแล้ว ทำให้เปลี่ยน RDBMS เป็นเจ้าไหนก็ได้ โดย business logic ไม่ต้องตามแก้ หรือถ้าแก้ก็ไมต้องไปทำอะไรกับ RDBMS เลย Hibernate จัดการให้หมด

v_grp Mon, 09/04/2007 - 23:37

ผมคิดว่า คุณไม่ค่อยถนัดจาวาเอาซะเลยนะครับ ผมคิดว่าการทำ type cast หรือ for loop เป็นสิ่งที่เป็นพื้นฐานมากในการเขียนจาวา ถ้าคุณใช้เวลาศึกษาเพิ่มอีกหน่อยก็น่าจะทำได้แล้ว ไม่ได้ยากอะไรเลย

ในโลกของจาวานั้นมีทางเลือกหลายทาง มีทางเลือกมากมายซึ่งถ้าผู้ศึกษาใหม่ ๆ เวลาศึกษาตัวภาษาพอเขียนได้แล้ว จะไปศึกษาต่อ ๆ ไปจะเจอเรื่องอะไรต่าง ๆเต็มไปหมด ไม่ว่าจะเป็น JSE JEE JME AWT Swing servlet ejb และ library ที่มีให้เลือกมากมาย อาจทำให้สับสนได้ง่าย อันนี้ผมว่าเป็นข้อด้อยอันหนึ่งที่ทำให้ต้องใช้เวลาศึกษาค่อนข้างมากกว่าจะทำความเข้าใจในแต่ละเรื่อง แต่ถ้ามองในทางกลับกัน ถ้าสำหรับการศึกษาผมว่ามันเป็นความหลากหลายที่เป็นแหล่งความรู้ที่ดีมาก ๆ กับเรา ซึ่ง library ใน java หรือ opensource project ต่าง ๆ ที่มีให้ใช้ก็มีมากมายและมีทั้งดีและไม่ดีอย่างที่คุณเขียน เพราะมีเยอะมากจึงมีทั้งดีและไม่ดีซึ่งแนะนำว่ามีบทความต่าง ๆ คอยเปรียบเทียบให้อยู่แล้ว ซึ่งสามารถกรองมาให้เราได้ในระดับหนึ่ง และค่อยไปศึกษาต่อจะทำให้ไม่สับสนครับ

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

ส่วนที่เริ่มมีมากก็คือ library ต่าง ๆ ที่มีให้ใช้ ไม่ว่าจะเป็นของภายใน java เอง ซึ่งอันนี้ จาวาแบ่งหลัก ๆ ออกเป็น 3 ระดับ ก็คือ JSE JME JEE ซึ่งก็คือสำหรับทั่วไป สำหรับมือถือ และสำหรับระดับ enterprise ซึ่งในส่วนนี้ก็จะมี library ให้เรียกใช้เพิ่มเติมตามลักษณะการทำงานของงานในหมวดนั้น ๆ ซึ่งเราจะทำงานในกลุ่มไหน ก็ไปศึกษา library ในส่วนนั้น ๆ ที่มีให้ใช้งานเพิ่มเติม ซึ่งควรศึกษาในส่วน library ของในส่วนทั่วไปให้รู้ก่อน ซึ่งก็จะมีพวก collection , io , thread หรือ concurrency แล้วถ้าจะไปทำ GUI app ก็ไปศึกษา swing หรือจะไปทำ JME ก็ไปศึกษา library ใน JME ที่มีให้ใช้งาน ต่อ ๆ ไป หรือในส่วน JEE ก็ไปศึกษาชุดคำสั่งที่มีให้ใช้งานต่อไป ส่วนต่อไปก็ java project ที่เป็น open source ซึ่งมีมากมาย หลังจากที่เราเริ่มพัฒนางานในหมวดที่เลือกแล้ว ในส่วนนี้ก็จะเข้ามาช่วยเราในการพัฒนางานเพื่อช่วยให้ไม่ต้องไปทำขึ้นมาใหม่ ซึ่งจะประหยัดเวลา ซึ่งมีทั้งเป็น library ให้เรียกใช้ หรือเป็น framework วาง pattern ในการพัฒนางานที่ดีให้กับเรา ทำให้พัฒนาได้ง่ายขึ้น และรวดเร็วขึ้น แต่ก็ต้องแลกกับเวลาที่ต้องใ้ช้ศึกษาการใช้งาน

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

ในส่วนของ performance ผมยังไม่มีความเห็นครับ เพราะยังไม่ได้ทดลองดู แต่คิดว่าในการพัฒนางานนั้นมันมีปัจจัยอื่น ๆ ประกอบด้วยนอกจากประสิทธิภาพครับ

ปล. คงเขียนมาชี้แจงเท่านี้แหละครับว่าจาวาไม่ได้แย่อะไรขนาดนั้นซะหน่อยครับ (ล้อเล่นนา) ;p

zen Mon, 09/04/2007 - 23:48

In reply to by v_grp

ตามอ่านเงียบๆ มานานทั้งที่นี่และ biolawcom.de

คิดว่าเรื่องที่คุณยกมา คุณ bow_der_kleine เค้าคงรู้หมดแล้วนะ เพียงแต่อาจจะไม่ถนัดเขียนจาวาเท่าไร (แถวนี้มีเซียนๆ เยอะ มีพระเจ้าจาวาอยู่ด้วย 1 องค์ เห็นมี "เทิดทูน" :P)

ตามอ่านคุณ deans4j มานานเหมือนกัน ทั้งที่นี่ pantip narisa

(ผมก็ใช้ java หากินนะ แต่ไม่เคยเทิดทูนขนาดนี้อะ)

idome Tue, 10/04/2007 - 01:28

นานา จิตตัง ครับ เวลาเปลี่ยน บางสิ่งบางอย่างเปลียน เรามิอาจค้นพบและคิดได้ตลอดเวลา

อย่าเลือกสิ่งที่ดีที่สุดครับ เลือกสิ่งที่เหมาะสมที่สุด

mr_tawan Tue, 10/04/2007 - 02:25

ตามอ่านมานานครับ แต่ว่าเพิ่งสมัคร ฝากเนื้อฝากตัวด้วยละักันครับผม (นายตาหวาน จาก TGDX ครับ)

ตอนแรกอ่านแล้วรู้สึกหงุดหงิด ๆ เล็ก ๆ เพราะว่าตัวเองใช้ Java อยู่บ้าง (ส่วนใหญ่ใช้ .NET หรือไม่ก็พวก Win32 ครับ หลัง ๆ มานี่) ศึกษา Lua มานิดหน่อย อิอิ อ่านแล้วความเห็นไม่ค่อยตรงกับที่รีวิวเท่าไหร่ แต่ว่าอ่านที่ท่าน deans4j โพสต์มาแล้วเลยคิดว่าคงไม่ต้องออกความเห็นตรงจุดนี้แล้วล่ะมั้ง

โดยส่วนตัวผมว่าการเอามาเปรียบเทียบแบบนี้ไม่ค่อยจะได้ประโยชน์เท่าไหร่ คิดว่า ถ้าให้ดีลองลิสต์เอาข้อดีของแต่ละภาษามาให้ดู แล้วให้คนอ่านมาเปรียบเทียบว่าภาษาไหนเหมาะสมกับงานประเภทไหน น่าจะได้ประโยชน์มากกว่าครับ

อย่าง สมมติ คนใช้ภาษา C/C++ มาก่อน ก็แน่นอนว่าเค้าจะต้องชอบอะไรที่มันคล้าย ๆ กัน อย่างผมเนี่ยผมจะถือว่า {} คือสิ่งที่สวรรค์ประทานมาให้เลยนะ โค๊ดในภาษา Java ถ้าถามผมนะ ผมว่ามันใกล้เคียงความงามชั่วนิรันดร์มากทีเดียว (เว่อร์มะ) แต่สำหรับคนใช้ BASIC มาก่อน ก็ร้อง ยี้ อะไรฟะ {} ไม่เห็นสื่อความหมายอะไรเลย งี้เป็นต้น

แล้วก็อาจจะเพิ่มส่วน Application Deployment ด้วยก็ดีนะครับผมว่า

อ้อ ในหลาย ๆ กรณี SWING นี่ใช้ง่าย ยืดหยุ่น มากกว่า .NET อีกนะครับ อาจจะช้า+หน้าตาไม่สวยไปนิดก็เหอะนะ :P

pittaya Tue, 10/04/2007 - 02:50

ผมยังเชื่อว่า Battery included ของ python ดีกว่า standard library ของ java นะ

ผมจะใช้ Java ในกรณีเดียวเท่านั้นคือ ต้องเขียนโปรแกรมร่วมกับคนอื่น ไม่งั้นผมใช้ภาษาอื่นตลอด

ปล. ผมเป็นสาวก python

JavaDevil Tue, 10/04/2007 - 08:54

ผมว่า ถ้าจะวัดความเร็วจริงๆ น่าจะหา code จากสุดยอดคนมาเทียบกันเลย แบบที่ Topcoder.com หรืออะไรสักอย่างเขียนกัน *0* จริงๆแล้วแต่คนชอบอะ ถ้าจะทำงานจริงผมใช้เป็นแค่ java ที่เสกได้ทุกอย่าง แต่ python มันมีดีตรงที่เอาไว้ใช้เขียน พวกงานที่เขียนแปปเดียว อ่านง่ายๆ เช่นพวก Swap ตัวแปลงี้ จาวา ซะยาว เลยกว่าจะสลับกันได้ พวก งูๆๆ เนี้ย บรรทัดเดียว

ps. What is Battery included?

sirn Tue, 10/04/2007 - 09:59

In reply to by JavaDevil

ผมว่า ถ้าจะวัดความเร็วจริงๆ น่าจะหา code จากสุดยอดคนมาเทียบกันเลย แบบที่ Topcoder.com หรืออะไรสักอย่างเขียนกัน *0*

Computer Language Shootout

nontster Tue, 10/04/2007 - 09:10

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

khajochi Tue, 10/04/2007 - 10:29

น่าจะมีประเด็นเรื่อง Job Opportunity ด้วยนะเนี่ย ... ไม่ว่าจะเขียนภาษาไหนก็เถอะ ถ้าไม่มีงาน ไม่มีตังค์ ก็ ...

crucifier Tue, 10/04/2007 - 11:07

In reply to by khajochi

นั่้นสิ น่าจะเอาคนเก่งๆ ในภาษานั้นๆ มาแข่งกันสมัครงาน ให้เวลาเท่ากัน ดูว่าใครได้งานเร็วกว่ากัน เงินเดือนมากกว่า วัดผลสองปี ใครมีความสุขในการทำงานมากกว่ากัน

เกี่ยวมะ???

lew Tue, 10/04/2007 - 16:38

In reply to by crucifier

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

ถ้าใครทำแล้วเขียนดีๆ ผมก็เอาขึ้น Sticky แน่ๆ ล่ะ ------ LewCPE

ThaiBuddy Wed, 11/04/2007 - 06:37

In reply to by lew

เห็นด้วยกับคุณ Lew เพราะมีหลากหลายประเด็น เน้นที่ผลที่ต้อง เช่น ต้องการทำเสร็จเร็ว การทำงานเร็ว ..ฯลฯ แต่ทำอย่างไรมีความสุขนี่เข้าสมัยดี .. ฮิ ฮิ ---------------- http://www.ThaiBuddy.com ฟรี T<->E dictionary แค่ชี้ mouse

หากว่าหัวข้อดี ๆ อย่างนี้อยู่แต่ในบล็อกของคุณโบว์ คงไม่ได้รับการคอมเม้นท์เยอะเพียงนี้แน่ ๆ แสดงว่าที่นี่เป็นคอนเทนเนอร์ที่ดีครับ ^o^ ----- http://www.peetai.com | เว๊ปบล็อกที่โม้แต่เรื่อง Software as a Service.

จริงๆเวลาเปรียบเทียบภาษา น่าจะระบุว่าเอาภาษานี้ไปใช้งานในแง่ไหนด้วยน่าจะดีกว่านะ แล้วก็ ประสปการณ์ของ programmer ทำให้ performance ของ program เดียวกัน ต่างกันได้มากจริงๆ

ส่วนตัวเขียน java เป็นหลัก เคยลอง python กับ ruby นิดๆหน่อยๆเท่านั้น เลยไม่รู้มากเรื่องสองภาษานี้ รู้สึกว่าเอา java มาเขียนระบบ distributed ใหญ่ๆ ต่อกับ system อื่นๆเยอะๆ transection หนักๆ ก็ยังทำงานได้ดี เสถียร แต่ถ้าจะต้องเขียนระบบที่ต่อกับ system อื่นๆมากมาย ยังไม่รู้ว่า python กับ ruby จะทำได้มั้ย? เพราะเห็นที่โปรโมทกันส่วนใหญ่จะเป็นเขียนเวปธรรมดาต่อกับ database เฉยๆ มากกว่า (แนวๆ shopping cart, cms)

ผมก็เชื่ออย่างนั้นนะ ว่าจาวาเหมาะกับระบบใหญ่ๆ แต่ผมมองว่าระบบใหญ่ๆ พวกนั้นมันต้องประมาณ eBay หรือไม่ก็ Amazon หรือไม่ก็พวกการเงินที่มี transaction ต่อวันเยอะๆ ไปนั่นเลย ส่วนเว็บในบ้านเรา 95% วันนึงอย่างมากก็ 1M PV โดยที่ข้อมูลไม่ได้มีอะไรเปลี่ยนแปลงมากมาย เกือบทั้งหมดเป็น CMS

ผมไม่ได้ไม่ชอบจาวาเพราะข้อเสียของมัน ข้อเสียของจาวาโดยทั่วไปแล้วมีเหตุผลทางวิศวกรรมที่จำเป็นต้องยอมรับข้อเสียเหล่านั้นเสมอๆ แต่ผมไม่ชอบจาวาที่หลายๆ คนพยายามมองมันเป็นยาวิเศษใช้งานได้กับทุกโรค ------ LewCPE

kaze Tue, 10/04/2007 - 20:33

In reply to by lew

อืม.. ผมได้ยินหลายคนบอกมาแล้วว่า จาวาเหมาะกับระบบใหญ่ๆ แต่ตอนผมทำงานที่บริษัทเก่า เป็นโปรแกรมเขียนด้วย C จัดการ transaction ด้านการเงินขนาด 60-70 ล้าน transaction ให้เสร็จภายใน 2 นาที ยังทำงานแทบไม่ทัน ตัว process ก็กิน memory เกือบถึง 4 GB

ผมเลยสงสัยว่า ถ้าภาษาที่ทดสอบแล้ว performance กิน memory มากกว่า C และใช้ cpu time มากกว่า C อย่าง Java, Python, Ruby จะเหมาะกับระบบใหญ่ๆ หรือครับ

อีกอย่างมีเกณฑ์ยังไงในการแบ่งว่าระบบนี่ใหญ่อ่ะครับ ?

nontster Tue, 10/04/2007 - 22:19

In reply to by kaze

ใหญ่ != เยอะ

น่าจะอยู่ที่ลักษณะงานครับ ผมเข้าใจว่าคำว่า "ใหญ่่" คือใหญ่ในแง่ของ function การทำงาน เช่นระบบ CMS ที่มี features เยอะๆนี่จะเรียกว่าใหญ่ก็ไม่ผิด

ที่บอกว่า "จาวาเหมาะกับระบบใหญ่ๆ" ผมกลับไม่คิดถึงเรื่องของการรับ load หรือการทำงานเป็น realtime แต่นึกไปถึงการออกแบบระบบที่ซับซ้อนมากกว่า

ถ้าผมเจอ case แบบที่คุณ kaze เจอ ผมก็จะใช้ C เขียนในงานส่วนนั้นครับ ระบบซอฟต์แวร์มันไม่จำเป็นต้องเป็น จาวา หรือ C อย่างเดียวไม่ใช่หรือ

sugree Tue, 10/04/2007 - 23:08

In reply to by kaze

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

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

1. เมื่อเขียนอย่างถูกวิธี Java จะเร็วกว่า Python เสมอ ซึ่งก็เป็นเรื่องปกติที่ static type จะเร็วกว่า dynamic type ถ้า Python เร็วกว่าก็แปลกแล้ว 2. เมื่อเขียนแบบเรื่อยเปื่อย Python จะเร็วกว่า Java ซึ่งเป็นจุดขายอย่างนึง บางครั้งเราต้องการพัฒนาระบบที่มีโครงสร้างซับซ้อน การปรับแต่งเป็นเรื่องรองลงมา ซึ่งต้องทำหลังจากที่โครงสร้างโดยรวมทำงานได้จริง ในความเป็นจริง Python ถูกออกแบบมาเพื่อเป็นภาษาสำหรับพัฒนาระบบต้นแบบ ทั้งนี้เป็นเพราะการออกแบบระบบขนาดใหญ่นั้นอาจมีข้อผิดพลาดในการใช้งานจริง การเขียน C อยู่ครึ่งเดือนแล้วพบว่ามีข้อบกพร่องต้องกลับไปแก้ใหม่เป็นเรื่องที่น่ากลัวมาก แทนที่จะต้องเผชิญความเสี่ยงแบบนั้นเราอาจพัฒนาระบบต้นแบบด้วย Python ทั้งหมดในเวลาเพียง 1 สัปดาห์ ถ้าพบข้อบกพร่องก็สามารถแก้ได้อย่างรวดเร็ว เมื่อทุกอย่างลงตัวจึงเขียนใหม่ด้วย Java หรือ C ก็แล้วแต่จะสะดวก สรุปง่ายๆ ว่า Python คือ pseudocode ที่บังเอิญทำงานได้

จุดสำคัญของการทำงานแบบ real-time หรือ mission critical ไม่ได้อยู่ที่ภาษาเสมอไป สถาปัตยกรรมสำคัญกว่ามาก ระบบที่ดีก็เหมือนถนน จะเอารถอะไรมาวิ่งก็วิ่งได้เต็มความเร็ว เพิ่มถนนรถก็วิ่งได้มากขึ้น ถ้าถนนขรุขระต่อให้มีรถแรงๆ ก็วิ่งไม่ออกอยู่ดี

panuta Tue, 10/04/2007 - 23:28

In reply to by sugree

ถ้าเป็นในแง่ของ Pseudo code เพื่อพัฒนาระบบที่มีความซับซ้อนแล้ว นอกจากความเร็วของโปรแกรมที่ทำได้ดีกว่า Java (ถ้าเขียนแบบเรื่อยเปื่อยอย่างที่บอก) แล้ว Python มีอะไรที่ช่วยสนับสนุนการเขียนแบบนี้ (เขียนเชิง Pseudo Code) อีกรึเปล่า?

----------------------- http://www.seasandsong.com/

sugree Tue, 10/04/2007 - 23:54

In reply to by panuta

เป็นคำถามที่ดีมาก

1. syntax และ grammar ของ Python เป็นตัวช่วยอย่างมาก คนส่วนใหญ่จะมองข้าม แต่ผมกลับเห็นว่ามันเจ๋งที่สุด มีไม่กี่ภาษาที่เห็นโค้ดแล้วเข้าใจในอึดใจเดียว Python ก็เป็นหนึ่งในนั้น เพราะไม่มีสัญลักษณ์พิเศษซับซ้อน ทุกอย่างกระจ่างชัดในตัวเอง ผมถึงบอกว่ามันเป็น pseudocode ที่บังเอิญทำงานได้จริง 2. Batteries Included เป็นสิ่งที่ใครๆ ที่ได้ลองใช้ Python ซักครั้งจะติดใจ อธิบายง่ายๆ ว่าไลบรารี่มาตรฐานของ Python มีสิ่งที่คนส่วนใหญ่มักใช้บ่อยๆ ทำให้การพัฒนาโปรแกรมที่ซับซ้อนง่ายลงไปถนัดใจ บางคนเคยบอกว่าไลบรารี่ที่ให้มามันไม่มีประสิทธิภาพ ผมไม่เถียง และเห็นด้วยในหลายๆ ครั้ง เจตนาของหลักการนี้มีเพื่อทำให้เรื่องยากกลายเป็นเรื่องง่าย แต่ไม่ใช่วิธีที่ดีที่สุดเสมอไป สิ่งที่ถูกรวมเข้ามาในไลบรารี่มาตรฐานล้วนแล้วแต่ผ่านการคัดกรองมาอย่างดีว่า "เป็นของเล่นที่ใช้งานได้จริง" แก้ปัญหาแบบตรงไปตรงมา ไม่สลับซับซ้อน 3. โครงสร้างข้อมูลพื้นฐาน เช่น list dict tuple ใน Python นั้นไม่ใช่กระสุนเงินในตำนานก็ใกล้เคียง มันไม่ใช่สิ่งที่ดีที่สุดสำหรับทุกงานเสมอไป แต่ในกรณีทั่วไปเราสามารถใช้มันโดยไม่รู้สึกว่าเป็นตัวถ่วง และในบางครั้งมันก็เร็วน่าพอใจ ที่สำคัญมันยืดหยุ่นมากพอที่จะรองรับงานเกือบทุกประเภท ถ้าอยากได้มากกว่านี้ก็สร้างลูกสร้างหลานกันเอง

เอ่อ คิดออกแค่นี้ ลองนึกถึงวิชา data structure ซึ่งแต่ละที่ก็สอนคนละแบบ ใช้คนละภาษา ปัญหาที่ผมพบตลอดเวลาก็คือมีหลายคนที่ไม่เชี่ยวชาญภาษาที่ได้รับมอบหมายมา เช่น C หรือ Java ซึ่งกลายเป็นว่าคนเหล่านี้ไม่ได้ใช้สมาธิกับ data structure แต่กลับต้องมาสนใจเรื่อง syntax, grammar และ library ของภาษานั้นๆ เขียน C ก็ต้องมั่วพอยเตอร์ รันสิบครั้งไม่เคยให้ผลเหมือนกัน เขียน Java ก็เมากับคู่มือ ไม่รู้จะเลือกใช้อะไรดี แค่อยากได้ dynamic array เท่านั้นเอง สุดท้ายจบมาแบบมึนๆ เขียนก็ไม่คล่อง โครงสร้างก็ไม่ถ่องแท้ ส่วนคนที่มีประสบการณ์กับภาษาพวกนั้นมาก่อนก็รอดไป

panuta Thu, 12/04/2007 - 01:23

In reply to by sugree

เรื่อง Syntax ผมว่าบางทีมันขึ้นอยู่กับพื้นฐานของแต่ละคนด้วยล่ะครับ ถ้าคนนึงมาจาก VB คนนึงมาจาก Java อีกคนมาจาก PHP ก็จะมองและเขียน Source Code ของภาษาใหม่ได้ยากง่ายต่างกัน

อืม... หรือผมเข้าใจผิด จริงๆคุณ sugree หมายถึงคนที่เขียน Python เป็นอยู่แล้ว มามอง Source Code ของคนอื่นรึเปล่า?

----------------------- http://www.seasandsong.com/

sugree Thu, 12/04/2007 - 01:43

In reply to by panuta

ผมหมายถึงคนที่เขียนไม่เป็นมาอ่านครับ สมมติว่าไม่รู้จัก VB ไม่รู้จัก Java ไม่รู้จัก PHP ไม่รู้จัก Ruby ไม่รู้จัก Perl ไม่รู้จัก C ไม่รู้จัก C++ ไม่รู้จัก Python เมื่อต้องมาเจอโค้ดที่ไม่รู้จักแล้วเราจะใช้เวลาทำความเข้าใจมากแค่ไหน นับหมดตั้งแต่วินาทีแรก และการเปิดค้นเอกสารทุกประเภทเพื่อให้รู้ว่าโค้ดนั้นทำอะไรกันแน่

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

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

'แต่ผมไม่ชอบจาวาที่หลายๆ คนพยายามมองมันเป็นยาวิเศษใช้งานได้กับทุกโรค' ชอบประโยคนี้และเห็นด้วย --- จากความรู้สึกของผมครับ

เห็นด้วยคน และขอเชียร์ ภาษา Erlang ถ้าใครจบสายสื่อสารจะรู้จักคำนี้(ผมจบสื่อสารสมัยยังไม่มีสาขาคอมฯ เรียน OS,database,system programing ..etc) ที่เดียวกับคนที่ทำ blog นี้แหละ(แต่นานมาแล้ว) ถ้าอยากทำ server MMORPG ก็มีบทความ 5 ตอน อยู่ที่นี้ครับ) Writing Low-Pain Massively Scalable Multiplayer Servers ตอนอื่น click ที่ navigator menu 'game design' จริงๆคือหาเรื่องเปิดประเด็นใหม่ กลัวกระเด็นเก่าจะร้อนเกินไป ฮิ ฮิ ---------------- http://www.ThaiBuddy.com ฟรี T<->E dictionary แค่ชี้ mouse

นอนเช้าจังเลยครับ ไม่น่าเชื่อว่า หลังจากผมคอมเม้นไป จะมีคอมเม้นเพิ่มมาอีก 8 ในช่วงเวลาใกล้รุ่ง (แนะ เผลอใช้คำคลาสสิก) --- จากความรู้สึกของผมครับ

>>แต่ผมไม่ชอบจาวาที่หลายๆ คนพยายามมองมันเป็นยาวิเศษใช้งานได้กับทุกโรค

นั่นมันก็ความผิดของคนใช้ ไม่ใช่ความผิดของภาษาซักหน่อย

fatgy Thu, 12/04/2007 - 12:12

มีideที่ช่วยเขียน ruby ชื่อ aptana+radrails นะครับ สามารถดูได้ที่ aptana.com นะครับ ปล. มีโปรแกรมเมอร์หญิงบ้างไหมเนี่ย lol

Gmz Fri, 13/04/2007 - 02:16

ide ที่ช่วยเขียน python ก็ dabo framework พึ่งเจอเมื่อวาน เขาพยายามเลียนแบบ vb ส่วน orm ก็ dejavu 1.4 (stable) เห็นแล้วมันก็น่าเล่นดี แต่ตอนนี้คิดแต่ว่าจบแล้วต้องมีงานทำ ยังมีบริษัทไม่กี่แห่งในไทยที่ใช้ python ถ้าเทียบกับ java แล้ว 1/30 ได้เลย งานและเงินครับที่เป็นปัจจัยสำคัญในการเลือก

cwt Sat, 14/04/2007 - 01:16

In reply to by Gmz

ก็เริ่มมีบ้างแล้วนะครับ อย่างผมนี่ได้เข้าทำงานในบริษัทใหญ่ๆ แถวๆ สวนลุม นี่ก็เพราะ python เลย

edit: ลืมบอกไปว่า ผมใช้ eclipse + pydev เป็นหลักนะ จริงๆ ก็ซื้อ wingide (www.wingware.com) มาใช้เองแล้ว แต่ไม่ค่อยถูกใจ กลายเ็ป็นว่าใช้ของฟรีดีกว่าแฮะ (แต่ license wingide รุ่น personal มันก็ไม่แพงนะ)

sugree Sat, 14/04/2007 - 19:36

In reply to by Gmz

1/30 มากไป ผมว่าทั้งประเทศคงมีไม่ถึง 1000 แห่งที่รู้จัก และใช้จริงไม่น่าจะเกิน 100 แห่ง รวมมหาวิทยาลัยแล้ว แต่ถึงยังไงผมก็ว่ามันแปลกนะ เลือกภาษาที่จะเขียนจากงานและเงิน

mrkrich Mon, 23/04/2007 - 00:44

In reply to by sugree

เห็นด้วยครับ .. สองสามเดือนก่อน เพื่อนผมมันถามว่าเขียนภาษาอะไรอยู่ ก็ตอบไปว่าตอนนี้เขียน python ... เลยเจอถามกลับมาอย่างมึนเลยว่า "ทำไมไปเขียนภาษาเก่าอย่างนั้นวะ ... เขียนเหมือนๆกับ cobol ตอนที่เรียนใช่มั๊ย?" เล่นเอาผมมึนไปเลย ...

xce1 Fri, 13/04/2007 - 23:35

สนุกดีครับ ผมว่า การฟังคนอื่นมากขึ้น ทำให้เรามีความรู้มากขึ้น บางคนอาจเห็นว่าเป็นความรู้ที่ไม่สำคัญ แต่ถ้าสมมติวันนึง เกิด programmer ภาษานึง ไปจีบสาวที่เป็น programmer อีกภาษานึง ผมว่าเค้าจะรู้สึกเสียดายที่ไม่ได้รู้ถึงเรื่องของอีกฝั่งเลย ถ้าเราเข้าใจถึง field ของแต่ละภาษา ก็จะเข้าใจว่า เราอาจไม่ได้อยู่สนามนั้นก็ได้ ------------ No more creative. But more producer! ijira.blogspot.com

xce1 Fri, 13/04/2007 - 23:36

สนุกดีครับ ผมว่า การฟังคนอื่นมากขึ้น ทำให้เรามีความรู้มากขึ้น บางคนอาจเห็นว่าเป็นความรู้ที่ไม่สำคัญ แต่ถ้าสมมติวันนึง เกิด programmer ภาษานึง ไปจีบสาวที่เป็น programmer อีกภาษานึง ผมว่าเค้าจะรู้สึกเสียดายที่ไม่ได้รู้ถึงเรื่องของอีกฝั่งเลย ถ้าเราเข้าใจถึง field ของแต่ละภาษา ก็จะเข้าใจว่า เราอาจไม่ได้อยู่สนามนั้นก็ได้ ------------ No more creative. But more producer! ijira.blogspot.com

F16 Mon, 23/04/2007 - 04:24

ได้ความรู้เพิ่มขึ้นมากเลยครับ ทั้งจาก Dr.Python และ Dr.JAVA

ผมอ่านแล้วก็ขำๆ ผมกำลังจะทำงานที่ใช้ภาษา Cobol ฮ่าๆ ตลกดี โบร๊าณโบราณ เรื่องภาษาผมไม่ค่อยได้สนใจเท่าไหร่ จะเก่าจะใหม่ จะดีจะเลิศแค่ไหนไม่สำคัญ! ขอแค่มันทำให้เรามีเงินเดือน เลี้ยงพ่อแม่ ส่งน้องเรียนให้จบ ทำให้ครอบครัวเรามีความสุข แค่เนี๊ย พอแล้วครับ..

"ผมมีความสุขเวลาเห็นพ่อกับแม่ยิ้ม ไม่ได้อยู่ที่ว่าจะเขียนโปรแกรมดีเลิศแค่ไหน" ^^

ผมอ่านแล้วก็คิดอะไรตลกๆได้อย่างหนึ่งครับ

"ริมถนนมีวิวสวยๆ อากาศดีๆ บางทีการขี่เฟอรารี่ ก็ไม่ได้ดีไปกว่าการเดิน.." อิอิ :D

ขอบคุณครับ

mk- Fri, 27/04/2007 - 11:28

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

VisionGolf Fri, 06/07/2007 - 11:09

VisionGolf says : โอ้ววว จนป่านนี้ OOP ผมยังไม่เอาอ่าวเลย T T

eakmotion Mon, 28/01/2008 - 23:41

โอ้ว !!! บทความนี้ผมเพิ่งเคยอ่าน

เป็น บทความ ที่ผมอ่านแล้วมีความสุขมากเลย (ขำทุก comment ^.^)

เคยได้ยินว่า "ทะเลอะกัน ดีกว่าหนีปัญหา" มันสร้างผลดี ให้มีการถกเถียงกัน ให้ได้ความรู้ดีๆ แบบนี้ นี่เอง

ขอบคุณทุกบทความ ในที่นี้ (ที่ทำให้ผม ขำ โคร ตๆ (ก็มีครั้งเนี๊ยแหละ ที่คุยกันเรื่องเขียนโปรเกรมเครียดๆ ให้เป็นเรื่องขำ ... ผมอ่านทุกข้อความเลยนะเนี๊ย ^.^))

eakmotion blog

cgtutor Fri, 01/02/2008 - 18:46

พอดีหาข้อมูลเรื่อง python อยู่ เลยเจอกระทู้ fight นี้ แนะนำเพิ่มเติมในส่วนสายงานที่ผมทำนะครับ ผมทำด้าน Visual Effect ,CG ในหนัง,โฆษณาใน zone asia นี้แหละครับ ภาษาเดียวที่จะเรียกว่า take over script ทุกตัวในวงการ เลย คือ ตัวนี้แหละครับ python แต่ผมเพิ่งหัดเองนะครับไม่ได้รักใคร่มันหรอก แต่ไปใช้ โปรแกรมไหนก็ python หมดเลย แต่ก็ถือเป็น standard ดีครับ เขียนเป็นแล้ว ต้องข้ามโปรแกรม ก็เอามาใช้ต่อได้ แก้นิดหน่อยเอง

risc Thu, 07/02/2008 - 12:49

สำหรับเด็กจบใหม่คิดว่าเป็นภาษาไหน จะมีโอกาสได้ทำงาน programmer เลี้ยงปากเลี้ยงท้องมากกว่ากันอะครับ ระหว่าง python กับ java ในไทยนะครับ

(search เจอแต่ java)

EmZ Tue, 07/10/2008 - 23:34

ผมว่า python ก็เป็นอีกทางเลือกนึงนะครับ
ผมพึ่งทำงานได้ 7 เดือน
ตอนนี้เงินเดือนพุ่งกระฉูดเลย

ขอบคุณ bow_der_kleine และ sugree ครับ
คนแก่อย่างผมเพิ่งเข้าใจว่า Python มีเสน่ห์อย่างไรก็วันนี้เอง คนอื่นอธิบายไม่เคยเข้าใจ
ชาบู \o/ o

ผมชอบ Java ทั้งที่ไม่ค่อยได้เขียน เพราะเกลียด C++ ที่ตัวเองถนัดที่สุด

หลายท่านให้ความเห็นเหมือนกันว่า C++ มันนรกชัดๆ +_+! (งั้น perl (โครงการใหญ่ๆ) ก็คืออเวจีนั่นเอง)
แต่ desktop app ใหญ่ๆ ก็ต้องให้เขาล่ะนะ ผมเห็นความเร็ว Lotus Symphony (Java/RCP) กับ MS Expression 4 (Silverlight) แล้วเชื่อว่า GUI เอาใจยูสเซอร์ก็ native C++ ดีกว่า แต่มันก็จะหมดอายุแล้วในโลก RIA

เข้าเรื่อง ในมุมมองคนทำงานโอเพนซอร์สนะครับ
พวกผมจะเลือกภาษาเองก็หมดสิทธิแหละครับ เจ้าของโครงการเขียนมายังไง เราจะแก้ก็ต้องไปตามเขา ก็รักเขานี่
ผมถึงชอบประชดเวลามีภาษาใหม่ฮิตขึ้นมาเพราะขี้เกียจอ่าน "The XYZ Programming Language" อีกเล่มแล้ว แต่ก่อนพยายามจะเลี่ยงโครงการที่ใช้ python หลายหนแต่ทนเสน่ห์ OpenERP ไม่ไหว (แต่จริงๆโดนไปตั้งแต่ Trac แล้ว) ส่วน perl ครั้งเดียวเข็ด ดูแลไม่ไหวจริงๆ แม้ว่า OTRS มันจะแสนดียังไงก็ตาม

วงการโอเพนซอร์สภาษาเยอะมาก แล้วแฮกเกอร์ก็ต้องอ่านมันได้หมดอีกไม่งั้นไม่คูล ตั้งแต่ bash, perl, awk, c, c++, java, javascript, php, python, (ruby, grail, ... OMG RIP) แต่ถ้าในแวดวง enterprise OSS ก็ให้ java เขาไป ตามด้วย python/php เบียดๆกันอยู่

ผมว่าต่อไปเถียงกันเรื่อง "java เหนียวส์" ดีกว่าไหม เทียบเรื่องเร็วโดยไม่แคร์เรื่องบริบทเช่นขนาดโปรเจกก็เหมือนเทียบแตงกวากับแตงโม ใครจะเชื่อว่าแตงกวามีน้ำมากกว่าแตงโม (นั่น! ไม่เชื่ออะซิ!)

ผมสรุปแบบเกรียนๆทีเดียวเลยแล้วกัน "c++ นรก perl อเวจี php รั่ว java เหนียวส์ python ง่ายย์"
โพสต์นี้สนุกดีครับ :) ขอบคุณทุกความเห็น อดมาเมนต์ต่อไม่ได้จริงๆ :P

Shutchon Tue, 09/11/2010 - 02:06

ขอบคุณครับ ผมชอบบทความนี้ครับเพราะเปิดหูเปิดตามือใหม่อย่างผม

อ่านมาแล้วอดไม่ได้ แจม ข้าม ปี
ส่วนตัวว่านะครับ
ระบบ obj นั้นเป็นเรื่องที่ดีนะครับ เพราะจะทำให้ง่าย
ฉะนัน java กินขาด เหนือฟ้ายังมีฟ้า คือ c เหนือ c ยังมี แอสเซมบลี ปล.เคยได้ เอ นะ อิอิ
ผมเคยจับ java c perl php python etc. ปล.ruby ไม่ได้จับ
ตอนนี้ก็ php กับ python ส่วน perl เล็กก็เขียนดี แต่นรกเหมือนกัน ถ้ายาวแล้ว
ยังเพิ่งศึกษา python คิดว่า obj คงไม่เท่า java เทียบความง่ายแล้ว ก็ โอนะครับ
แนวเขียนได้ ทำให้เขียนได้หลากหลายครับ
แต่เอาความนิยมแล้ว python คงสู้ java ยากเนื้องจาก มานานกว่า
แต่ผมโดนใจเรื่อง data stucture นะครับ มั่วแต่ดู ไวยกร ยิ่ง tc แล้วเจ็บ แต่ก็จำมาบ้างนะ ออกแนวซาดิส

เนื่องจากต้องรีบซักผ้า
ไม่รู้ละ ตอนนี้ผมใช้ python กับ php เล่นไปคู่กันอะ

เนื่องจากใครจับภาษาไหน ก็จะชอบไปในทางนั้น นี้ละคน
แต่สิ่งที่สำคัญที่สุดคือ

การ join กันครับ obj จึงเป็นที่นิยม คือมองในทางเดียวกันให้ได้
python อยากให้ คล้าย java จะดีมาก แต่เขียนหลากหลายพอกัน คิดไงเขียนให้สนุกก็พอแล้ว

อาชีพ นี้เครียดนะครับ คิดไงให้ผ่อนคล้ายสมอง ขีเกียจไล่ code เล็กๆน้อย นี้ละ มีดของแท้
เอาเป็นว่า ลองเองครับ ชอบอันไหนก็อันนั้น

เสน่ของ คน ก็ไม่ต่าง ภาษา แล้วแต่คนชอบ คนโน่นคนนี้แนะนำ ก็ไม่เท่าคบดูเองครับ อันนี้บอกไม่ได้ครับ

ขอพูดเท่ๆละกัน

อุ๊บะอันตะอู้ Sun, 24/07/2011 - 21:57

ชอบมาก

ผมเปลี่ยนจาก php, js, au3 ได้ ก็เพราะเห็นความสวยของ python นี่แหละฮะ

และมันก็ดีสมคำร่ำลือ อ่านงายโพดๆ

ไม่คดรีเทิร์นไปหา php อีกเลย

ขยาดมากๆ ตอนแก้โค้ด

เพราะผมชอบเขียนย่อๆแบบ คุณ deans4j ใน http://www.blognone.com/node/4385#comment-20299

แล้วพอแก้โค้ด ผมก็แบบว่า "เอิ่ม~ เขียนใหม่เฮอะฉัน -*-"

แต่พอมาใช้ python นี่ reuse code ทั้งก็อป ทั้ง mod ง่ายดายทีเดียว อ่านแป๊ปเดียวรู้เรื่องเลยฮะ

grit Mon, 20/02/2017 - 08:13

โอ๊ะ อยู่ๆ มาโผล่ที่นี่ได้ไงหว่า กระทู้ในตำนาน เกิดไม่ทัน

Apple
public://topics-images/apple_webp.png
SCB10X
public://topics-images/347823389_774095087711602_515970870797767330_n_webp.png
Windows 11
public://topics-images/hero-bloom-logo.jpg
Huawei
public://topics-images/huawei_standard_logo.svg_.png
Google Keep
public://topics-images/google_keep_2020_logo.svg_.png
Instagram
public://topics-images/instagram_logo_2022.svg_.png
Microsoft
public://topics-images/microsoft_logo.svg_.png
Basecamp
public://topics-images/bwpepdi0_400x400.jpg
FTC
public://topics-images/seal_of_the_united_states_federal_trade_commission.svg_.png
Pinterest
public://topics-images/pinterest.png
Palantir
public://topics-images/-nzsuc6w_400x400.png
AIS Business
public://topics-images/logo-business-2021-1.png
PostgreSQL
public://topics-images/images.png
JetBrains
public://topics-images/icx8y2ta_400x400.png
Krungthai
public://topics-images/aam1jxs6_400x400.jpg
Palworld
public://topics-images/mccyhcqf_400x400.jpg
Bill Gates
public://topics-images/bill_gates-september_2024.jpg
VMware
public://topics-images/1nj4i1gp_400x400.jpg
Take-Two Interactive
public://topics-images/0khle7nh_400x400.jpg
OpenAI
public://topics-images/ztsar0jw_400x400.jpg
Thailand
public://topics-images/flag_of_thailand.svg_.png
ServiceNow
public://topics-images/ytnrfphe_400x400.png
Klarna
public://topics-images/urcllpjp_400x400.png
Google Play
public://topics-images/play.png
Drupal
public://topics-images/drupal.png
Virtua Fighter
public://topics-images/virtua_figther_2024_logo.png
Paradox Interactive
public://topics-images/paradox_interactive_logo.svg_.png
Europa Universalis
public://topics-images/europa-icon.png
Nintendo Switch 2
public://topics-images/mainvisual.png
Cloudflare
public://topics-images/cloudflare_logo.svg_.png
Samsung
public://topics-images/samsung.png
Google
public://topics-images/google_2015_logo.svg_.png
Uber
public://topics-images/uber.png
Microsoft 365
public://topics-images/m365.png
USA
public://topics-images/flag_of_the_united_states.svg_.png
GM
public://topics-images/0pe0po-z_400x400.jpg
Perplexity
public://topics-images/perplex.jpg
Xperia
public://topics-images/xperia.png
iOS 18
public://topics-images/ios-18-num-96x96_2x.png
True
public://topics-images/true_logo.png
SoftBank
public://topics-images/softbank.jpg
Pac-Man
public://topics-images/pacman.png
Harry Potter
public://topics-images/harry.png
Marvel
public://topics-images/marvel.png
Skydance
public://topics-images/skydance.png
SEA
public://topics-images/sealogo.png
Find Hub
public://topics-images/find.png
Accessibility
public://topics-images/accessibility-128x128_2x.png
Material Design
public://topics-images/m3-favicon-apple-touch.png
Android 16
public://topics-images/android16.png
Android
public://topics-images/android_0.png
Firefox
public://topics-images/firefox_logo-2019.svg_.png
Google Messages
public://topics-images/messages.png
Notepad
public://topics-images/notepad.png
Singapore
public://topics-images/flag_of_singapore.svg_.png
Airbnb
public://topics-images/airbnb.png
PS5
public://topics-images/ps5.png
Krafton
public://topics-images/krafton.png
Doom
public://topics-images/doom-game-s_logo.svg_.png
AMD
public://topics-images/amd_logo.svg_.png
GTA
public://topics-images/gta_0.png
DoorDash
public://topics-images/doordash.png
YouTube
public://topics-images/yt.png
YouTube Music
public://topics-images/yt-music.png
Facebook
public://topics-images/fb.png
iQiyi
public://topics-images/iqiyi_0.png
Viu
public://topics-images/viu.png
Amazon Prime Video
public://topics-images/prime-vid.png
Spotify
public://topics-images/spotify.jpg
Apple TV
public://topics-images/apple-tv.png
HBO Max
public://topics-images/max.png
Threads
public://topics-images/threads.png
Alexa
public://topics-images/alexa.png
Kindle App
public://topics-images/kindle.png
Shopee
public://topics-images/shopee.png
Waze
public://topics-images/waze.png
Bilibili
public://topics-images/bili.png
Google Maps
public://topics-images/maps.png
Apple Music
public://topics-images/apple-music.png
Claude
public://topics-images/claude.png
TikTok
public://topics-images/tiktok.png
Xbox
public://topics-images/xbox.png
Tesla
public://topics-images/tesla.png
Chrome
public://topics-images/chrome.png
Google Calendar
public://topics-images/gcal.png
Google Home
public://topics-images/ghome.png
Google Meet
public://topics-images/meet.png
NotebookLM
public://topics-images/notebooklm.png
Reddit
public://topics-images/reddit.png
Assassin’s Creed
public://topics-images/ac.png
Mark Zuckerberg
public://topics-images/zuck.jpg
Meta
public://topics-images/meta.png
Meta AI
public://topics-images/meta-ai.png
Epic Games
public://topics-images/epic_games_logo.svg_.png
Unreal
public://topics-images/unreal_engine_logo-new_typeface-svg.png
Fortnite
public://topics-images/fortnite.png
DeepMind
public://topics-images/deepmind.png
Databricks
public://topics-images/databricks.png
Netflix
public://topics-images/netflix-logo.png
Microsoft Azure
public://topics-images/azure.png
Microsoft Copilot
public://topics-images/microsoft_copilot_icon.svg_.png
Bing
public://topics-images/bing.png
EA
public://topics-images/ea.png
Intel
public://topics-images/intel.png
Amazon
public://topics-images/amazon.png
AWS
public://topics-images/aws.png
Zoom
public://topics-images/zoom.png
Dropbox
public://topics-images/dropbox_0.png
Dell Technologies
public://topics-images/dell-tech.png
Nothing
public://topics-images/nothing.svg_.png
Microsoft Teams
public://topics-images/teams.png
Mojang
public://topics-images/mojang.png
Minecraft
public://topics-images/minecraft.png
Redis
public://topics-images/redis_logo.svg_.png
Ubisoft
public://topics-images/ubisoft_logo.svg_.png
Elden Ring
public://topics-images/elden.png
Brave
public://topics-images/brave.png
Opera
public://topics-images/opera.png
Vivaldi
public://topics-images/vivaldi.png
Microsoft Edge
public://topics-images/edge.png
Duolingo
public://topics-images/duolingo.png
LinkedIn
public://topics-images/linkedin.png
Canva
public://topics-images/canva.png
Realme
public://topics-images/realme.png
NASA
public://topics-images/nasa-logo.png
Booking.com
public://topics-images/booking.png
Agoda
public://topics-images/agoda.png
Bolt
public://topics-images/bolt.png
Temu
public://topics-images/temnu.png
LINE
public://topics-images/line.png
Facebook Messenger
public://topics-images/messenger.png
WhatsApp
public://topics-images/whatsapp.png
Telegram
public://topics-images/telegram.png
Signal
public://topics-images/signal.png
X.com
public://topics-images/x.png
Grok
public://topics-images/grok.png
xAI
public://topics-images/xai.png
CapCut
public://topics-images/capcut.png
Edits
public://topics-images/edit.png
Google One
public://topics-images/gone.png
Tinder
public://topics-images/tinger.png
Whoscall
public://topics-images/whoscall.png
OneDrive
public://topics-images/onedrive.png
Lightroom
public://topics-images/lr.png
Meitu
public://topics-images/meitu.png
Outlook
public://topics-images/outlook.png
Excel
public://topics-images/excel.png
PowerPoint
public://topics-images/ppt.png
Microsoft Word
public://topics-images/word.png
Phone Link
public://topics-images/phone-link.png
OneNote
public://topics-images/onenote.png
Windows App
public://topics-images/windows-app.png
Notion
public://topics-images/notion.png
Google Drive
public://topics-images/drive.png
YouTube Kids
public://topics-images/yt-kids.png
Gboard
public://topics-images/gboard.png
DeepSeek
public://topics-images/deepseek_logo.svg_.png
Prince of Persia
public://topics-images/prince-persia.png
Sony
public://topics-images/nq0nd2c0_400x400.jpg
Cisco
public://topics-images/jmyca1yn_400x400.jpg
Alibaba Cloud
public://topics-images/qm43orjx_400x400_cloud.png
Coinbase
public://topics-images/consumer_wordmark.png
CarPlay
public://topics-images/carplay.png
Rust
public://topics-images/rust-logo-blk.png
Red Hat
public://topics-images/redhat.png
Anthropic
public://topics-images/anthropic.png
Xcode
public://topics-images/xcode.png
Tim Cook
public://topics-images/tim-cook.jpg
Donald Trump
public://topics-images/trump.jpg
Microsoft Surface
public://topics-images/surface.jpg
Copilot+ PC
public://topics-images/copilotpc.png
Stellar Blade
public://topics-images/stellar-blade.jpg
Snapdragon
public://topics-images/snapdragon_chip.png
Qualcomm
public://topics-images/qualcomm-logo.svg_.png
CoreWeave
public://topics-images/coreweave.png
Ford
public://topics-images/ford.png
Xiaomi
public://topics-images/xiaomi.png
Google Cloud
public://topics-images/google_cloud_logo.svg_.png
PlayStation Network
public://topics-images/psn.png
PlayStation Plus
public://topics-images/ps-plus.png
Windsurf
public://topics-images/windsurf.png
Square Enix
public://topics-images/square-enix.png
MIT
public://topics-images/x7hyjl3t_400x400.jpg
Zoox
public://topics-images/zoox.jpg
Evernote
public://topics-images/1neatidg_400x400.jpg
Magic the Gathering
public://topics-images/magic.png
Call of Duty
public://topics-images/cod.png
NVIDIA
public://topics-images/nvidia_logo.svg_.png
Satya Nadella
public://topics-images/nadella.png
Nintendo
public://topics-images/nintendo.png
Japan
public://topics-images/japan_flag.png
China
public://topics-images/china-flag-sq.png
Sam Altman
public://topics-images/sam-altman.png
SNK
public://topics-images/snk_logo.svg_.png
EPYC
public://topics-images/epyc.png
HPE
public://topics-images/hpe.png
Juniper
public://topics-images/juniper.png
CMA
public://topics-images/cma.png
App Store
public://topics-images/app-store.png
DoJ
public://topics-images/doj.png
Siri
public://topics-images/siri.png
Apple Intelligence
public://topics-images/apple-intelligence.png
Acer
public://topics-images/acer.png
GeForce
public://topics-images/geforce.png
Omen
public://topics-images/omen.png
HP
public://topics-images/hp.png
Alienware
public://topics-images/alienware.png
Dell
public://topics-images/dell.png
Bungie
public://topics-images/bungie.png
Marathon
public://topics-images/marathon.png
Intel Arc
public://topics-images/badge-arc-graphics.png
GitHub
public://topics-images/8zfrryja_400x400.png
GitHub Copilot
public://topics-images/copilot.png
Foxconn
public://topics-images/foxconn_0.png
Visual Studio
public://topics-images/vs.png
Visual Studio Code
public://topics-images/vscode.png
WSL
public://topics-images/wsl.png
Linux
public://topics-images/linux.png
Tencent
public://topics-images/tencent_logo_2017.svg_.png
Entra
public://topics-images/microsoft_entra_id_color_icon.svg_.png
RHEL
public://topics-images/rhel-icon.png
MSI
public://topics-images/msi-logo-for_digital_use_b.png
MCP
public://topics-images/mcp.png
Docker
public://topics-images/docker.png
RISC-V
public://topics-images/risc-v-logo.svg_.png
Fedora
public://topics-images/fedora.png
ASUS
public://topics-images/asus.png
ROG
public://topics-images/rog-logo_red.png
Naughty Dog
public://topics-images/naughty-dog.png
AIS
public://topics-images/357073423_657473419752809_8491928084596189631_n.png
National Telecom
public://topics-images/nt.jpg
Elon Musk
public://topics-images/elon_musk_2015_0.jpg
OpenShift
public://topics-images/openshift-logotype.svg-0.png
Shift Up
public://topics-images/shiftup.png
Bethesda
public://topics-images/bethesda.png
The Elder Scrolls
public://topics-images/tes.png
CATL
public://topics-images/img_7841.png
Radeon
public://topics-images/radeon.png
Borderlands
public://topics-images/borderlands4.png
Android XR
public://topics-images/android-xr.png
Ninja Theory
public://topics-images/ninja.jpg
Jonathan Ive
public://topics-images/ive.jpg
Bitcoin
public://topics-images/bitcoin.svg_.png
Baidu
public://topics-images/baidu.jpg
Wear OS
public://topics-images/wearos.png
Activision
public://topics-images/activision.svg_.png
Netmarble
public://topics-images/netmarble.png
NetEase
public://topics-images/netease.png
Fujifilm
public://topics-images/l_9ycfw2_400x400.png
Google Vids
public://topics-images/vids.png
Google Docs
public://topics-images/docs.png
Google Sheets
public://topics-images/sheets.png
Google Chat
public://topics-images/gchat.png
Google Slides
public://topics-images/slides.png
Google Photos
public://topics-images/photos_0.png
Snapchat
public://topics-images/snapchat.png
Google TV
public://topics-images/gtv.png
Android Auto
public://topics-images/aauto.png
Gmail
public://topics-images/gmail.png
Google Forms
public://topics-images/forms.png
Google Workspace
public://topics-images/workspace_0.png
Android Studio
public://topics-images/android_studio_logo_2024.svg_.png
Pocket
public://topics-images/spnhfky8_400x400.png
Mozilla
public://topics-images/mozilla.jpg
Thunderbird
public://topics-images/thunderbird.png
Bluesky
public://topics-images/bluesky.jpg
Warhammer
public://topics-images/warhammer-bw.png
Relic Entertainment
public://topics-images/relic_entertainment_logo.svg_.png
Age of Empires
public://topics-images/age_of_empires_franchise_logo.png
Azul
public://topics-images/azul.png
Meta Quest
public://topics-images/meta-quest.png
Informatica
public://topics-images/qzlzwpsp_400x400.jpg
Salesforce
public://topics-images/salesforce.com_logo.svg_.png
Steam
public://topics-images/steam.png
Valve
public://topics-images/valve_logo.svg_.png
SteamOS
public://topics-images/steamos_wordmark.svg_.png
Steam Deck
public://topics-images/steam-deck.png
Arch Linux
public://topics-images/archlinux-logo-standard-version.svg_.png
Half-Life
public://topics-images/orange_lambda.svg_.png
Counter-Strike
public://topics-images/counter-strike.png
OnlyFans
public://topics-images/onlyfans_logo_icon_blue.png
Strava
public://topics-images/strava.png
Mortal Kombat
public://topics-images/mortal-kombat.png
Canon
public://topics-images/canon.png
Snipping Tool
public://topics-images/snipping.png
Microsoft Paint
public://topics-images/paint.png
Microsoft Photos
public://topics-images/photos.png
File Explorer
public://topics-images/file_explorer.png
Git
public://topics-images/git-logo.svg_.png
Star Wars
public://topics-images/star-wars.png
Activision Blizzard
public://topics-images/actvision-blizz.png
Microsoft Store
public://topics-images/microsoft-store.png
France
public://topics-images/france.png
Ricoh
public://topics-images/ricoh_logo_2005.svg_.png
Xeon
public://topics-images/xeon.png
.NET
public://topics-images/dotnet.png
SQL Server
public://topics-images/microsoft_sql_server_2025_icon.svg_.png
Power BI
public://topics-images/power-bi.png
Microsoft Fabric
public://topics-images/fabric.png
MSN
public://topics-images/msn.png
SharePoint
public://topics-images/sharepoint.png
Ubuntu
public://topics-images/ubuntu-logo-2022.svg_.png
Debian
public://topics-images/debian-openlogo.svg_.png
LLM
public://topics-images/7410e129-824e-479c-93c7-558e87130b8f.png
Meituan
public://topics-images/meituan.png
Logitech
public://topics-images/logitech_logo.svg_.png
Llama
public://topics-images/llama.png
Oracle
public://topics-images/oracle_logo.svg_.png
Arc Browser
public://topics-images/arc.png
Circle
public://topics-images/circle.png
T-Mobile
public://topics-images/tmobile.jpg
Starlink
public://topics-images/starlink.jpg
SpaceX
public://topics-images/hbri04tm_400x400.jpg
Apple Arcade
public://topics-images/en-us-large-1x.png
TypeScript
public://topics-images/typescript.svg_.png
AlmaLinux
public://topics-images/almalinux.png
Subnautica
public://topics-images/subnautica.png
Clair Obscur
public://topics-images/clair-33.png
Dragon Quest
public://topics-images/dragon_quest_logo.png
Twitter
public://topics-images/twitter300.png
One UI
public://topics-images/one-ui.png
Fire TV
public://topics-images/amazon_fire_tv_2024.svg_.png
Stellantis
public://topics-images/stellantis.png
Taobao
public://topics-images/taobao.png
WeChat
public://topics-images/wechat.png
Alipay
public://topics-images/alipay.png
DingTalk
public://topics-images/dingtalk.png
Alibaba
public://topics-images/alibaba-group-logo.svg_.png
Pokemon
public://topics-images/international_pokemon_logo.svg_.png
NBTC
public://topics-images/nbtc.png
CD Projekt
public://topics-images/cd_projekt_logo.svg_.png
Cyberpunk 2077
public://topics-images/cyberpunk.png
The Witcher
public://topics-images/witcher.png
Boeing
public://topics-images/boeing.png
Discord
public://topics-images/discord.png
Grammarly
public://topics-images/grammarly.png
Google Lens
public://topics-images/lens.png
WordPress
public://topics-images/wordpress.png
Automattic
public://topics-images/automattic.png
Zotac
public://topics-images/zotac.png
Black Forest Labs
public://topics-images/flux.png
Sega
public://topics-images/sega.png
Twitch
public://topics-images/twitch.png
Person
public://topics-images/gemini_generated_image_ddj47iddj47iddj4.png
IntelliJ
public://topics-images/intellij.png
CrowdStrike
public://topics-images/cs_logo.png
Bandai Namco
public://topics-images/bandainamco.png
Oppo
public://topics-images/oppo.png
Dontnod
public://topics-images/don-t_nod.png
Hugging Face
public://topics-images/huggingface.png
Bixby
public://topics-images/logo_bixby_new.svg_.png
Gemma
public://topics-images/gemma.png
Flash Express
public://topics-images/flash.png
Lyft
public://topics-images/lyft.png
James Bond
public://topics-images/007.png
Snowflake
public://topics-images/snowflake.png
IO Interactive
public://topics-images/ioi.png
The Sims
public://topics-images/the_sims.png
Character.AI
public://topics-images/character_ai.png
IBM
public://topics-images/xy93qvy4_400x400.png
USB
public://topics-images/usb-logo.png
Zynga
public://topics-images/zynga.svg_.png
Broadcom
public://topics-images/broadcom.png
Photoshop
public://topics-images/ps.png
Adobe
public://topics-images/adobe.png
Premiere Pro
public://topics-images/premier.png
Database
public://topics-images/gemini_generated_image_nlgayenlgayenlga.png
GeForce Now
public://topics-images/gf-now.png
Go
public://topics-images/o6aczwfv_400x400.png
ChatGPT
public://topics-images/chatgpt.png
Final Fantasy
public://topics-images/ff.png
Swift
public://topics-images/swift_logo.svg_.png
Cursor
public://topics-images/cursor.png
AirPods
public://topics-images/airpods_pro2.png
AirPods Max
public://topics-images/airpodsmax.png
Koei Tecmo
public://topics-images/koei_tecmo.png
Team Ninja
public://topics-images/team-ninja.png
Disney+
public://topics-images/disney-plus.png
Capcom
public://topics-images/capcom.png
Pornhub
public://topics-images/pornhub-logo.svg_.png
Proton
public://topics-images/proton.png
PlayStation
public://topics-images/playstation.png
GOG
public://topics-images/gog-logo.png
Mistral
public://topics-images/mistral.png
No Man's Sky
public://topics-images/nomansky.png
Hello Games
public://topics-images/hello-games-logo.png
SCB
public://topics-images/scb.png
Kasikorn Bank
public://topics-images/kbank.png
Grasshopper Manufacture
public://topics-images/grasshopper-100.png
Metal Gear
public://topics-images/metal_gear_franchise_logo.svg_.png
Google Wallet
public://topics-images/g-wallet.png
PayPal
public://topics-images/paypal.png
Mark Cuban
public://topics-images/cuban.jpg
Giant Squid
public://topics-images/giant-squid.png
Black Myth: Wukong
public://topics-images/blackmyth.jpg
Deathloop
public://topics-images/deathloop_logo.webp_.png
Resident Evil
public://topics-images/residentevil.png
Street Fighter
public://topics-images/street_fighter_logo.png
Ryu Ga Gotoku
public://topics-images/ryugagotokustudio.png
Like a Dragon
public://topics-images/lad-logo.png
Sonic the Hedgehog
public://topics-images/sonic.png
Blender
public://topics-images/logo_blender.svg_.png
Volvo
public://topics-images/volvo-iron-mark-black.svg_.png
Atomic Heart
public://topics-images/atomic.png
Hitman
public://topics-images/hitman.png
Mac
public://topics-images/apple-finder.png
Arc Raiders
public://topics-images/arc-raiders.jpg
Krungsri Bank
public://topics-images/krungsri.png
Lenovo
public://topics-images/branding_lenovo-logo_lenovologoposred_low_res.png
Owlcat Games
public://topics-images/owlcat.png
Scale
public://topics-images/scale_ai.png
The Outer Worlds
public://topics-images/1600px-outerworlds-logo.png
Obsidian Entertainment
public://topics-images/obsidian_entertainment.svg_.png
Avowed
public://topics-images/avowed.png
Grounded
public://topics-images/grounded.png
Atlus
public://topics-images/atlus_logo_thin_stroke_277x108.png
High on Life
public://topics-images/high-logo.png
Ryzen
public://topics-images/ryzen.png
Flight Simulator
public://topics-images/microsoft_flight_simulator.png
Indiana Jones
public://topics-images/indiana_jones_logo.svg_.png
Dawnwalker
public://topics-images/the-blood-of-dawnwalker-logo-light.png
Rebel Wolves
public://topics-images/rebel-wolves-logo-black.png
inXile
public://topics-images/inxile_entertainment_logo.png
Double Fine Productions
public://topics-images/double-fine.png
Game Freak
public://topics-images/game_freak_logo.svg_.png
iOS 26
public://topics-images/ios26.png
Tahoe
public://topics-images/macos26.png
iPadOS 26
public://topics-images/ipados26.png
Zelda
public://topics-images/zelda_logo.svg_.png
watchOS 26
public://topics-images/watchos26.png
Apple Vision Pro
public://topics-images/applevisionpro.png
Amiibo
public://topics-images/amiibo.png
Thunder Lotus
public://topics-images/thunder-lotus.png
Games
public://topics-images/role-playing_video_game_icon.svg_.png
Waymo
public://topics-images/waymo.png
Grab
public://topics-images/grab_0.png
Fallout
public://topics-images/fallout_logo.svg_.png
Warner Bros. Discovery
public://topics-images/wbd.png
Splatoon
public://topics-images/splatoon.png
Gemini
public://topics-images/google_gemini_logo.png
Kingston
public://topics-images/kingston.png
Roblox
public://topics-images/roblox_thumb.png
Google Pixel
public://topics-images/pixel_wordmark.svg_.png
Jensen Huang
public://topics-images/jensen-headshot-1906-600x338.png
Midjourney
public://topics-images/61396273.png
NBCUniversal
public://topics-images/umh_w5l-400x400.png
Disney
public://topics-images/disney.png
Snap
public://topics-images/snap_inc.png
Wikipedia
public://topics-images/wikipedia-logo-v2.svg_.png
Kaggle
public://topics-images/kaggle_logo.svg_.png
Wikimedia Foundation
public://topics-images/wikimedia_foundation.png
IonQ
public://topics-images/ionq.png
Apple TV+
public://topics-images/apple_tv_plus.png
Slack
public://topics-images/slack.png
Webex
public://topics-images/webex.png
Wayland
public://topics-images/wayland.png
GNOME
public://topics-images/gnomelogo.svg_.png
X.Org
public://topics-images/xorg.png
PCI-SIG
public://topics-images/pci-sig_logo.png
PCI
public://topics-images/pci_express.svg_.png
Instinct
public://topics-images/instinct.png
MariaDB
public://topics-images/img_9067.png
Mattel
public://topics-images/mattel-2019-svg.png
Silent Hill
public://topics-images/silent_hill_2022_logo.png
Bloober Team
public://topics-images/blooberlogo260b.png
India
public://topics-images/flag_of_india.png
Nexon
public://topics-images/nexon.svg_.png
Helldivers
public://topics-images/helldivers_print_logo.png
Mac Mini
public://topics-images/mac-mini-202410-gallery.png
Dyson
public://topics-images/dyson.png
Mario Kart
public://topics-images/mario-kart-100.png
Germany
public://topics-images/flag_of_germany.svg_.png
Gears of War
public://topics-images/gears-of-war-logo-2006.png
Warren Buffett
public://topics-images/buffett.png
Craig Federighi
public://topics-images/craige1.png
Boston Dynamics
public://topics-images/boston.png