• Log InLog In
  • Register
Liquid`
Team Liquid Liquipedia
EDT 11:07
CEST 17:07
KST 00:07
  • Home
  • Forum
  • Calendar
  • Streams
  • Liquipedia
  • Features
  • Store
  • EPT
  • TL+
  • StarCraft 2
  • Brood War
  • Smash
  • Heroes
  • Counter-Strike
  • Overwatch
  • Liquibet
  • Fantasy StarCraft
  • TLPD
  • StarCraft 2
  • Brood War
  • Blogs
Forum Sidebar
Events/Features
News
Featured News
[ASL22] Ro4 Preview: Mirror Mirror6[ASL22] Ro8 Preview: Within Reach5[ASL22] Ro8 Preview: In A Tizzy11[ASL22] Ro16 Preview: Holy Diver5[ASL22] Ro16 Preview: Rough Waters10
Community News
Weekly Cups (October 5-11): Farewell to 5.0.162Rollback Netcode in Brood War995.0.17 Patch Notes - October 7, 202624Weekly Cups Results (Sep 28-Oct 4)0SC4ALL: II SC2 Complete Invited Player Lineup10
StarCraft 2
General
How do you feel about the mass reverts in the 5.0.17 PTR? SCII needs to put more weight on strategy and tact Server Blocker 5.0.17 Patch Notes - October 7, 2026 ESL Pro Tour for SC2 discontinued
Tourneys
$3,500 WardiTV Not-Summer Championship Stellar Fest TWO the Moon (Dec 16-20) ISSL (IntoTheTV x SOOP SC2 League): Premier RSL 2026 Offline Finals LCQ Sign-Ups ScienceCraft (October 24-25) - Live Event
Strategy
[H] ZvP Mid-Late Game: Stalkers Collossi HT
Custom Maps
[G] How to playtest arcade maps [A] Nemrods 1/4 players [M] (2) Sweltering Sands [M] (2) Frigid Storage
External Content
The PondCast: SC2 News & Results Mutation # 547 Temple Of Terror Mutation # 546 Catch the Train Mutation # 545 And Drops and Rifts
Brood War
General
BW General Discussion Sagi.gg Launcher Released Bot on ladder Rollback Netcode in Brood War ASL22 General Discussion
Tourneys
ASL 22 Finals [Women's StarCraft] MonstarZ vs Dreams 2026-10-15 [Megathread] Daily Proleagues [ASL22] Semifinal B
Strategy
Cliff Jump Revisited (1 in a 1000 strategy) Simple Questions, Simple Answers Replay Review Process - What do you do?
Other Games
General Games
Nintendo Switch Thread Dawn of War IV Stormgate/Frost Giant Megathread General RTS Discussion Thread Warcraft III: The Frozen Throne
Dota 2
Dota 2 Champions League Season 3 Begins April 25!
League of Legends
[TL LoL EUW IHs] Teemo shall perish
Heroes of the Storm
Heroes of the Storm 2.0
Hearthstone
Deck construction bug
TL Mafia
TL Mafia Community Thread
Community
General
US Politics Mega-thread Things Aren’t Peaceful in Palestine Russo-Ukrainian War Thread Artificial Intelligence Thread Canadian Politics Mega-thread
Fan Clubs
Serral Fan Club
Media & Entertainment
[Manga] One Piece Movie Discussion! Diablo Animated Series on Netflix
Sports
Football (Soccer) Thread TeamLiquid Health and Fitness Initiative For 2023 MLB/Baseball 2023
World Cup 2022
Tech Support
Computer Build, Upgrade & Buying Resource Thread
TL Community
Recent Gifted Posts
Blogs
The Link Between Gaming and …
TrAiDoS
[ASL22] Ro4 Day1 Ticket Giv…
bITt.mAN
38 yo Retired SWE loo…
PurE)Rabbit-SF
Can Bots Beat Pros?? Starcr…
namkraft
[meme] I finally understa…
LUCKY_NOOB
Customize Sidebar...

Website Feedback

Closed Threads



Active: 11529 users

A programming lesson I won't forget

Blogs > Barbiero
Post a Reply
Barbiero
Profile Blog Joined September 2010
Brazil5259 Posts
July 09 2014 05:52 GMT
#1
So, I'm a CS student. My parents own a radio company(they are lit. Motorola resellers) and they have their share of needs in the world of computing, but they never actually asked me to do something until now. That's because only now have I been actually learning how to develop stuff properly.

Queue the request. It's a fairly simple system to create deadlines for certain jobs in the company, and show who is delaying or not. It's kinda cool.

The issues are, of course, the details. The request was simple: "we want to provide a time window in hours for a job, and the program has to give a date as the deadline". Simple right? Except that the deadline has to account for work days and hours.

Since I have little experience with the various programming languages, my language of choice is Java. Reason being that I'm more used to it and because I know it's very easy to find well documented libraries for almost everything in Java. And alas, there is joda-time as a sweeet date/time language. Love it.

However, It obviously does not include the concept of work days/hours. So how the f* do I implement that?


Man, have I learned a lot of lessons today. First I tried to implement a new class called WorkDateTime to simulate LocalDateTime. Too complicated and most of the functions were duplicates. Scratched.

I ended up making a function that converts a LocalDateTime to the next work hour compatible: so something at 12:20 would be converted to 13:30 on the same day, and Friday 19:00 would become Monday 08:00 of the next week. Joda-time is really good at that.

But the issue was with addition. Since I had a number of hours to serve as a base for my deadline, I needed to find a way to add these hours into a base time(the time of assignment for the job) and not count the non-working hours. Do I add and then count backwards? Do I try to predict it? Fuck this isn't trivial at all.

While trying to think of the solution, one came to mind that made me chuckle: add the hours one by one. For each addition, verify if the time "overflowed" past work hours. If so, convert the time to the next work hour and add the overflow. Finish the loop when there are neither hours nor overflow to add anymore.

I chuckled because that's one hell of an inefficient algorithm. It runs on more-than-linear time compared to the size of the deadline. I thought "that's stupid!" and went back to trying to figure out an efficient algorithm.

I spent literally 8 hours doing that(with a break to watch Liquid win and Brazil get destroyed by Germany). I still haven't figured out how would I implement the algorithm to consider the work hours when adding the new hour.

What did I do? I implemented the "inefficient" one. Not because I gave up, but because it wasn't worth to go to the next day thinking about it when the "inefficiency" isn't THAT costly: the calculation is done once per part of job(so about 150 times a day tops) and most of the deadlines are 2 to 5 hours, maybe one or another with a 20 hour deadline. When you translate this to computer processing, it's a ridiculously small value. The time I waste trying to figure out the efficient one will never be worth the smudge of efficiency I would harvest.

So I literally brute forced my way through this one. Lesson learned: just because it may not be the most efficient, if the efficiency is negligible the development cost isn't worth it.


On a side note, the IntelliJ Idea is awesome. Now to figure out how to work with databases... *shrug*
♥ The world needs more hearts! ♥
icystorage
Profile Blog Joined November 2008
Jollibee19350 Posts
July 09 2014 06:03 GMT
#2
5 star for a programming blog.
LiquidDota StaffAre you ready for a Miracle-? We are! The International 2017 Champions!
SilverSkyLark
Profile Blog Joined April 2008
Philippines8437 Posts
July 09 2014 09:09 GMT
#3
What IDE are you using?
"If i lost an arm, I would play w3." -IntoTheWow || "Member of Hyuk Hyuk Hyuk cafe. He's the next Jaedong, baby!"
LightTemplar
Profile Blog Joined August 2011
Ireland481 Posts
July 09 2014 09:12 GMT
#4
To quote Knuth:
"We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil"

Before you ever try to come up with a better algorithm to solve the problem you are facing its a really good idea to do some back of the envelope calculations and figure out how much your inefficiency is actually going to cost in real world terms. Its probably a little late to point that out now but hey you learned the lesson. Best of luck continuing with your development!
"Thoughts are always there, the mind can't stop" - Grubby
Noyect
Profile Blog Joined July 2010
Sweden129 Posts
July 09 2014 12:26 GMT
#5
Cool to see a programming blog
Been practicing on and off myself aswell and the algorithms really are the challenging part :D
This question is more intended as quick brainstorming from a student looking to learn rather
than advice from someone knowledgeable :D

Instead of adding the hours one by one and checking to see if they overflow to the next day, could you
not "re-label" the hours so that hours 1-9 are monday, 10-18 are tuesday and so on?
If a job takes 22 hours you'ld know that it falls into the scope of wednesday.
Stegosaurus
Profile Joined March 2011
United States52 Posts
Last Edited: 2014-07-09 14:59:12
July 09 2014 14:58 GMT
#6
On July 09 2014 18:09 SilverSkyLark wrote:
What IDE are you using?



Since he mentions IntelliJ IDEA, I would guess that.

Good on you for jumping on IDEA, it's an incredible IDE.
If you're writing in Java, and trying to use databases, you should definitely consider using Hibernate. It's pretty awesome.
*insert witty comment here*
Barbiero
Profile Blog Joined September 2010
Brazil5259 Posts
July 09 2014 15:42 GMT
#7
On July 09 2014 21:26 Noyect wrote:
Cool to see a programming blog
Been practicing on and off myself aswell and the algorithms really are the challenging part :D
This question is more intended as quick brainstorming from a student looking to learn rather
than advice from someone knowledgeable :D

Instead of adding the hours one by one and checking to see if they overflow to the next day, could you
not "re-label" the hours so that hours 1-9 are monday, 10-18 are tuesday and so on?
If a job takes 22 hours you'ld know that it falls into the scope of wednesday.

This falls off when dealing with holidays, company breaks etc. Basically, later I'll need to have a holiday database as well.

Also yeah I'm using intellij idea
♥ The world needs more hearts! ♥
obesechicken13
Profile Blog Joined July 2008
United States10467 Posts
Last Edited: 2014-07-09 23:12:40
July 09 2014 23:11 GMT
#8
On July 09 2014 18:12 LightTemplar wrote:
To quote Knuth:
"We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil"

Before you ever try to come up with a better algorithm to solve the problem you are facing its a really good idea to do some back of the envelope calculations and figure out how much your inefficiency is actually going to cost in real world terms. Its probably a little late to point that out now but hey you learned the lesson. Best of luck continuing with your development!

To be honest, it's really hard to know just how efficient your code has to be, because you don't know if you're slowing database queries or writing inefficient code that occasionally results in crashes/spikes to your services.

I think if you don't know how efficient your code needs to be it can be worthwhile to take the time to think of a way to optimize it slightly.

(I just need to really have a massive failure before I agree with Knuth).
I think in our modern age technology has evolved to become more addictive. The things that don't give us pleasure aren't used as much. Work was never meant to be fun, but doing it makes us happier in the long run.
CatNzHat
Profile Blog Joined February 2011
United States1599 Posts
July 10 2014 04:55 GMT
#9
How would you go about figuring out 23 work hours from now, starting at 2pm today, as a human, with pen and paper.

This is how you should start when you develop an algorithm.

I would start with breaking it into 2 separate pieces, how many days from now, and how many hours into that day.

23 hours is 2 days (8 hrs each) and 7 hours (23 - (2*8) = 7)
Simply advance current time by 2 days and 7 hours.
But wait, what if it's 12:00pm right now, that would mean I've already worked 3 hours today, so if I go 7 hours forward I'll end up with 10 hours. Delegate back to the same logic, 10 hours is 1 day and 2 hours. Advance a day, start 2 hours in.


We can see a pattern starting to form here, you have a concept of hours in a work day, and you have a concept of how that maps to hours in a day. The same pattern holds for days of work in a week.

If it's the 5th work day in the week and the last hour in that day, adding two hours will have to advance the day, which will advance the week.

The class could be laid out with a configuration something like this:
hours_in_workday: 8
start_of_week: monday
start_of_weekend: saturday
length_of_weekend: 2 days
start_of_day: 9:00am
start_of_lunch: 12:00pm
lunch_duration: 1:00hr

With this information you can construct a pretty simple time keeping system, and configure it as needed. Insert national holidays, etc.. etc..

While this solution is definitely more efficient than yours, I never once considered performance. All I was thinking of was the simplest solution that was easy to understand. I start with how I would solve the problem by hand with pen and paper. It's rather straight forward and kind of trivial when you really think about it. The only 'logic' is a switch to simply say 'is this number of hours larger than the work day' and 'is this number of days larger than the work week'.

Code clarity and simplicity is what allows you to build and maintain complex code bases.

There is a unique skillset for figuring out how you're really solving a problem, I mean if I told you to figure out what time you'd be done with something next week if you start on a wednesday afternoon at 2pm if it were to take you exactly 34 hours and you worked exactly 40 hours a week.

You'd be able to figure it out, and you wouldn't iterate through each hour to do it. You might even optimize your solution without even realizing it, subtracting the number of hours left in the current week since you know it will be some time next week, and then subtracting from that in 8 hour chunks to determine how many days into the next week it would be, and then subtracting 4 to determine how many hours after your lunch break it will be.

Converting that to code is a separate matter, and can be done many different ways, and that is where the real performance issues can be benchmarked and addressed.
rebdomine
Profile Blog Joined October 2010
6040 Posts
July 11 2014 09:22 GMT
#10
On July 09 2014 23:58 Stegosaurus wrote:
Show nested quote +
On July 09 2014 18:09 SilverSkyLark wrote:
What IDE are you using?



Since he mentions IntelliJ IDEA, I would guess that.

Good on you for jumping on IDEA, it's an incredible IDE.
If you're writing in Java, and trying to use databases, you should definitely consider using Hibernate. It's pretty awesome.


I think it is worthwhile to learn the basics of SQL though before jumping straight into Hibernate. I see a lot of people struggling with native SQL cause they've been too used to Hibernate.
"Just because you are correct doesn't mean you are right!"
Count9
Profile Blog Joined May 2009
China10928 Posts
July 13 2014 01:38 GMT
#11
Thought this was gonna be about the scheduling problem and algorithms from the beginning. Also, pretty sure your solution is linear time :p
SpeaKEaSY
Profile Blog Joined December 2010
United States1070 Posts
July 14 2014 11:49 GMT
#12
haha I'd do this sort of thing on math tests where they had you add large numbers in series, I'd just write a quick program for the TI-83+ to brute force the problem rather than solve it analytically
Aim for perfection, settle for mediocrity - KawaiiRice 2014
ZeaL.
Profile Blog Joined April 2009
United States5955 Posts
Last Edited: 2014-07-18 20:32:27
July 18 2014 20:32 GMT
#13
oops
Please log in or register to reply.
Live Events Refresh
Next event in 7h 54m
[ Submit Event ]
Live Streams
Refresh
StarCraft 2
LamboSC2 312
MaxPax 242
ProTech124
BRAT_OK 80
Codebar 26
StarCraft: Brood War
Calm 11264
Horang2 528
Mini 368
firebathero 353
Soma 341
Snow 309
Hyuk 286
ggaemo 282
Leta 124
Mong 88
[ Show more ]
Mind 72
PianO 67
Bishop 52
Sea.KH 52
Hyun 49
sSak 41
ToSsGirL 37
hero 35
Shinee 29
Noble 27
Terrorterran 25
Bale 18
JYJ 14
zelot 14
ajuk12(nOOB) 12
yabsab 12
Sacsri 11
Dota 2
Gorgc7263
Dendi1059
XaKoH 494
420jenkins249
syndereN240
canceldota22
Counter-Strike
x6flipin211
Other Games
singsing2114
fl0m2000
B2W.Neo839
hiko812
mouzStarbuck269
Khaldor251
KnowMe248
DeMusliM210
crisheroes180
Hui .168
Beastyqt163
Liquid`VortiX156
QueenE65
Liquid`Hasu22
[ Show 13 non-featured ]
StarCraft 2
• Adnapsc2 13
• AfreecaTV YouTube
• intothetv
• Kozan
• IndyKCrew
• Migwel
StarCraft: Brood War
• ChaeLyn 5
• BSLYoutube
• STPLYoutube
• ZZZeroYoutube
Dota 2
• C_a_k_e 1997
League of Legends
• Nemesis2630
• Jankos1277
Upcoming Events
OSC
7h 54m
Online Event
19h 54m
Korean StarCraft League
1d 11h
Afreeca Starleague
1d 14h
Rush vs Soulkey
CranKy Ducklings
1d 18h
AI Arena Tournament
2 days
BSL Open Qualifier
2 days
Sparkling Tuna Cup
2 days
OSC
2 days
IPSL
3 days
[ Show More ]
BSL Open Qualifier
3 days
WardiTV Weekly
3 days
IntoTheTV X SOOP
4 days
PiGosaur Cup
5 days
The PondCast
5 days
Kung Fu Cup
5 days
IntoTheTV X SOOP
6 days
Liquipedia Results

Completed

Proleague 2026-10-14
Blizzard Classic Cup 2026
Copium Cup

Ongoing

ASL Season 22
Super Anchor Qualifying S3
Acropolis #5
HCC Season 3
Thunderpick World Champ. '26
ESL Pro League Season 24
Stake Ranked Episode 4
1win Private Club #1
Logitech G Play Connect 2026
SL StarSeries Fall 2026
FISSURE Playground #3
BLAST Open Fall 2026
Esports World Cup 2026
BLAST Bounty Summer 2026

Upcoming

Acropolis #5 - GSC
BSL Season 23
SC4ALL II: Brood War
BSL 23: Non-Korean Championship
HSC XXX
Stellar Fest 2: Lunar Cup
SC4ALL II: StarCraft II
Kung Fu Cup 2026 Grand Finals
RSL Offline Finals
eXTREMESLAND 2026
PGL Major Singapore 2026
Stake Ranked Episode 6
BLAST Rivals Fall 2026
IEM Beijing 2026
Stake Ranked Episode 5
PGL Masters Bucharest 2026
1win Private Club #2
TLPD

1. ByuN
2. TY
3. Dark
4. Solar
5. Stats
6. Nerchio
7. sOs
8. soO
9. INnoVation
10. Elazer
1. Rain
2. Flash
3. EffOrt
4. Last
5. Bisu
6. Soulkey
7. Mini
8. Sharp
Sidebar Settings...

Advertising | Privacy Policy | Terms Of Use | Contact Us

Original banner artwork: Jim Warren
The contents of this webpage are copyright © 2026 TLnet. All Rights Reserved.