השוואת מימושים - רובי מול פייתון
האם השפה עדיין חשובה עכשיו כש AI יכול לקודד ולתרגם בלי בעיה? בניסוי היום נראה שלפחות המודלים של היום בוחרים מגבלות מוצריות אחרות לפי שפת התכנות בה ביקשנו את הקוד.
פרומפט ראשון בפייתון:
create a python function that takes a CSV file path with customer data (assume email column) and returns a list of the customers as list of dictionaries deduplicated by email
והמימוש:
import csv
def load_customers(csv_path):
customers = []
seen_emails = set()
with open(csv_path, mode="r", newline="", encoding="utf-8") as file:
reader = csv.DictReader(file)
if "email" not in reader.fieldnames:
raise ValueError("CSV must contain an 'email' column")
for row in reader:
# Normalize email so casing/whitespace doesn't create duplicates
email = row["email"].strip().lower()
if email not in seen_emails:
seen_emails.add(email)
row["email"] = email
customers.append(dict(row))
return customers
כמה דברים בולטים:
אין טיפול ב BOM, שהוא תו נסתר בתחילת הקובץ שמציין את סדר הבתים. בלי טיפול זה אם עמודת email היא הראשונה אנחנו עלולים לקבל את הטקסט
\uFEFFemailבתור שם העמודה במקום רק email וכך ההשוואה תכשל.ערך email חסר בשורה מסוימת מפעיל
stripעל None, נכשל ומרסק את כל הפונקציה במקום לדלג על הערך החסר.אם יש מספר שורות עם אותה כתובת מייל המימוש שומר רק את הראשון ולא ממזג את הנתונים.
אין וולידציה או אורך מינימלי על כתובת מייל כך שעמודת email ריקה גורמת לשמירה של הנמען.
עכשיו אני מנסה פרומפט כמעט זהה, רק מחליף את השפה:
create a ruby function that takes a CSV file path with customer data (assume email column) and returns a list of the customers as list of dictionaries deduplicated by email
התוצאה:
require "csv"
def load_customers(csv_path)
customers_by_email = {}
CSV.foreach(csv_path, headers: true) do |row|
customer = row.to_h
email = customer["email"]&.strip&.downcase
next if email.nil? || email.empty?
# Keep the first customer found for each email
customers_by_email[email] ||= customer
end
customers_by_email.values
end
כמה מאפיינים בולטים:
גם כאן אין טיפול ב BOM.
השימוש ב
&.אומר שערכים חסרים לא מרסקים את הפונקציה.המימוש ברובי מדלג על ערכים ריקים.
גם ברובי לוקחים רק את הנתונים של הלקוח הראשון במקום למזג.
סך הכל למרות שהמימושים דומים והקוד קצר אנחנו רואים שתי החלטות שונות בין השפות: מה עושים כשחסר אימייל ומה עושים אם האימייל ריק.
הבעיה עם AI ושפות תכנות היא ששפות תכנות היום לא יודעות לסמן "החלטות" או "כללים" ולהפריד אותם מאופן הביצוע. מצב "תכנון" או תוספים כמו "גריל מי" מנסים לגשר על הפער הזה אבל אנחנו עדיין לא שם. הייתי שמח לראות את שפות התכנות של העתיד מחצינות את "הכללים" שכל שורת קוד מגדירה וכך מקלות על בני אדם את הכניסה לקוד וקבלת ההחלטות.